0

JSON をエンコードしているときに、ステートメントを使用してアンラップしif letていますが、変数をグローバルに使用できるようにしたいと考えています。

do {
  if
    let json = try JSONSerialization.jsonObject(with: data) as? [String: String], 
    let jsonIsExistant = json["isExistant"] 
  {
    // Here I would like to make jsonIsExistant globally available
  }

これは可能ですか?そうでない場合は、ifこの中で声明を出すことができますが、それは賢明ではないと思いますし、可能でさえないと思います.

4

2 に答える 2

1

必要な場所で jsonIsExistant を宣言します。iOS アプリを作成している場合は、上記よりもviewDidLoad()変数を作成します

var jsonIsExistant: String?

次に、この時点でそれを使用します

do {
    if let json = try JSONSerialization.jsonObject(with: data) as? [String: String], 
    let tempJsonIsExistant = json["isExistant"] {
        jsonIsExistant = tempJsonIsExistant
    }
}

このように書き換えることもできますが、

do {
    if let json = try JSONSerialization.jsonObject(with: data) as? [String: String] { 
        jsonIsExistant = json["isExistant"]
    }
} catch {
    //handle error
}

2 番目の方法で処理する場合は、使用前に jsonIsExistant が nil かどうかを確認する必要があります。jsonになることに成功するたびに、常に「isExistant」フィールドがあると確信している場合。

于 2016-11-10T20:06:17.337 に答える
1

if let変数をステートメントの外側に公開するのは意味がありません。


if let json = ... {
    //This code will only run if json is non-nil.
    //That means json is guaranteed to be non-nil here.
}
//This code will run whether or not json is nil.
//There is not a guarantee json is non-nil.

やりたいことに応じて、他にもいくつかのオプションがあります。


必要な残りのコードjsonif. ifあなたは、ネストされたステートメントが「賢いか、可能か」さえわからないと言いました。それらは可能であり、プログラマーはそれらを頻繁に使用します。別の関数に抽出することもできます。

func doStuff(json: String) {
    //do stuff with json
}

//...
if let json = ... {
    doStuff(json: json)
}

JSON が であってはならないことがわかっている場合はnil、次のように強制的にアンラップできます!

let json = ...!

guardステートメントを使用して変数をグローバルにすることができます。内のコードは、 の場合guardのみ実行されます。ステートメントの本体は、たとえば、エラーをスローするか、関数から戻るか、ラベル付きのブレークを使用して、囲んでいるスコープを終了する必要があります。json nilguard

//throw an error
do {
    guard let json = ... else {
        throw SomeError
    }
    //do stuff with json -- it's guaranteed to be non-nil here.
}



//return from the function 
guard let json = ... else {
    return
}
//do stuff with json -- it's guaranteed to be non-nil here.



//labeled break
doStuff: do {
    guard let json = ... else {
        break doStuff
    }
    //do stuff with json -- it's guaranteed to be non-nil here.
}
于 2016-11-10T20:10:41.683 に答える