swiftのjson読み込み

Foundationに含まれているJSONSerializationを使う

JSON文字列をパースするには、JSONSerialization.jsonObjectを使用する。

JSONSerializationJ .jsonObject(with JSONデータ: Data, options オプション)

import Foundation 
import CryptoSwift 

let jsonString: String = "{\"id\":3932, \"company\":\"Akatsuki\"}"

var personalData: Data = jsonString.data(using: String.Encoding.utf8)!

do {
    let items = try JSONSerialization.jsonObject(with: personalData) as! Dictionary<String,Any>
    print(items["id"] as! Int)
    print(items["company"] as! String)
} catch {
    print(error)
}

3932
Akatsuki

書き方を変える。

let jsonString: String = "{\"id\":3932, \"company\":\"Akatsuki\"}"

var personalData: Data = jsonString.data(using: String.Encoding.utf8)!
let items = try JSONSerialization.jsonObject(with: personalData) as! Dictionary<String,Any>
var code:Int = items["id"] as! Int
print(code)

3932

ではXcodeに当てはめましょう。
そもそも、import Foundationって、xcodeに使えるのか?

swift foundation
https://github.com/apple/swift-corelibs-foundation
The Foundation framework defines a base layer of functionality that is required for almost all applications. It provides primitive classes and introduces several paradigms that define functionality not provided by either the Objective-C runtime and language or Swift standard library and language.

よくわかりませんが、やってみましょう。

Info.plistとは

Info.plist
—————-
アプリで共通的な設定をInfo.plistという設定ファイルで行う。
Info.plistのファイル名は、「<プロジェクト名>Info.plist」という名前になっている。

http通信で、App Transport Security Settingsの下にAllow Arbitrary Loadsを追加する。

swift: intを浮動小数点数で割る時

CalcVC.mySales = Int(self.sales.text!)! / 109
            CalcVC.myProfit = Int(self.profit.text!)! / 109.53
            CalcVC.myPrice = Int(self.price.text!)!
            CalcVC.myEPS = Double(self.eps.text!)!

Int(self.profit.text!)! / 109.53 とすると、エラーになるが、Int(self.profit.text!)! / 109に変えるとエラーが消える。為替の世界だと、109.00と109.53は全く違うので、Int(self.profit.text!)の方の型を変えないといけない。

あれ、さらにエラーが出た

Replace 'Double(self.sales.text!)! / 109.53' with 'Int(Double(self.sales.text!)! / 109.53)'

なるほど。受け取り側の型に合わせるのね。賢すぎ。

intでcastします。

if identifier == "showResult" {
            let CalcVC = segue.destination as! CalcViewController
            CalcVC.mySales = Int(Double(self.sales.text!)! / 109.53)
            CalcVC.myProfit = Int(Double(self.profit.text!)! / 109.53)
            CalcVC.myPrice = Int(self.price.text!)!
            CalcVC.myEPS = Double(self.eps.text!)!
        }

なるほど

109.53で割った数がintで表示されます。

ドル円の値をjsonで取得したい。(いよいよ趣旨に少しづつ近づいて来ました。)

swiftのDouble(浮動小数型)

swiftでDouble(浮動小数型)を使う。sales, profit, stockpriceはint, epsはdoubleで定義する。

    var mySales:Int = 0
    var myProfit:Int = 0
    var myPrice:Int = 0
    var myEPS:Double = 0.0

outletでconnectする。

@IBOutlet weak var salesLabel: UILabel!
    @IBOutlet weak var profitLabel: UILabel!
    @IBOutlet weak var priceLabel: UILabel!
    @IBOutlet weak var epsLabel: UILabel!

ResultViewController.swift
遷移先のViewControllerに値をセットする。

if identifier == "showResult" {
            let CalcVC = segue.destination as! CalcViewController
            CalcVC.mySales = Int(self.sales.text!)!
            CalcVC.myProfit = Int(self.profit.text!)!
            CalcVC.myPrice = Int(self.price.text!)!
            CalcVC.myEPS = Double(self.eps.text!)!
        }

CalcViewController.swift
データを受け取り、textで表示する。

override func viewDidLoad() {
        super.viewDidLoad()
        self.salesLabel.text = "\(self.mySales)"
        self.profitLabel.text = "\(self.myProfit)"
        self.priceLabel.text = "\(self.myPrice)"
        self.epsLabel.text = "\(self.myEPS)"

        // Do any additional setup after loading the view.
    }

さあ、compileしてみましょう。

textfieldに入力した値がcalcViewController.swiftに渡っています。

売り上げ(sales)と経常利益(profit)はドルで表示したい。
円からドル円(109.529025)で割ってみましょう。

shouldPerformSeguedでalertをだす

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        if identifier == "showResult" {
            guard self.sales.text != "" else{
                let alertController = UIAlertController(title: "Error", message: "Please enter your name", preferredStyle: .alert)
                let defaultAction = UIAlertAction(title:"OK", style: .default, handler: nil)
                alertController.addAction(defaultAction)
                self.present(alertController, animated: true, completion: nil)
                return false
            }
            return true
        }
        return true
    }

初期

text fieldがnilの時

textfieldの値をviewControllerに送る

オプショナル型とは変数にnilの代入を許容するデータ型で、反対に非オプショナル型はnilを代入できません。オプショナル型の変数にはデータ型の最後に「?」か「!」をつける。

textFieldの値をvarで宣言し、飛び先のview controllerでも変数を初期化する。segue.destionationで飛び先のviewcontrollerを取り、変数にsetする。

resultViewController.swift

@IBOutlet weak var sales: UITextField!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let CalcVC = segue.destination as! CalcViewController
        CalcVC.mySales = Int(self.sales.text!)!
    }

segueの値がshowResultの時のみ、変数に値を渡す。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let identifier = segue.identifier else {
            return
        }
        if identifier == "showResult" {
            let CalcVC = segue.destination as! CalcViewController
            CalcVC.mySales = Int(self.sales.text!)!
        }
    }

absで絶対値に変換する

連敗中は、「-3連敗」ではなく、「3連敗」としたい。

if self.load > 1 {
self.gameResult.text = String(self.load) + str
} else if self.load < -1{ self.gameResult.text = String(abs(self.load)) + strl } else { } [/code] きたーーーーーー
とりあえず、じゃんけんアプリ完成!
さて、app申請したい。

連勝中に負けた時、連敗中に勝った時の処理を加える

@IBAction func getChoki(_ sender: Any) {
        let results2 = ["Image1","Image2","Image3"]
        let random2 = arc4random_uniform(UInt32(results2.count))
        let image2 = UIImage(named: results2[Int(random2)])
        imageView.image = image2
        let image5 = UIImage(named: "Image5")
        imageView2.image = image5
        
        let even = "あいこ"
        let win = "あなたの勝ち"
        let lose = "あなたの負け"
        
        if random2 == 0 {
            self.gameResult.text = lose
            if self.userDefaults.object(forKey: "load") != nil {
                if self.userDefaults.integer(forKey:"load") < 0 {
                    self.load = self.userDefaults.integer(forKey:"load")
                    self.load -= 1
                } else {
                    self.load = -1
                }
            } else {
                self.load = -1
            }
        } else if(random2 == 1){
            self.gameResult.text = even
            if self.userDefaults.object(forKey: "load") != nil {
                self.load = self.userDefaults.integer(forKey: "load")
            } else {
                self.load = 0
            }
        } else {
            self.gameResult.text = win
            if self.userDefaults.object(forKey: "load") != nil {
                if self.userDefaults.integer(forKey:"load") > 0 {
                    self.load = self.userDefaults.integer(forKey:"load")
                    self.load += 1
                } else {
                    self.load = 1
                }
            } else {
                self.load = 1
            }
        }
        self.gameResult.text = String(self.load) + str
        UserDefaults.standard.set(self.load, forKey: "load")
    }

7連勝中でも、一度負けると-1連勝に成りました。
あとはviewの分岐ですね。