2015-07-03 2 views
1

Я использую SwiftyJSON для вызова некоторых API-интерфейсов и получения некоторых данных. Когда я использую:if allow variable - Использование неразрешенного идентификатора

if let variable = json["response"]["fieldname"] { 
} else { 
    println("error") 
} 

Я не могу использовать переменную в дальнейшем, например, чтобы добавить значение в массив. Например:

if let variable1 = json["response"]["fieldname1"] { 
} else { 
    println("error") 
} 
if let variable2 = json["response"]["fieldname2"] { 
} else { 
    println("error") 
} 
var currentRecord = structure(variable1, variable2) ---> This line returns an error (use of unresolved identifier variable1) as not able to find variable1 or variable2 
myArray.append(currentRecord) 

Как я могу решить эту проблему?

ответ

3

Область действия if let находится внутри скобок сразу после его:

if let jo = joseph { 
    // Here, jo is in scope 
} else { 
    // Here, not in scope 
} 
// also not in scope 
// So, any code I have here that relies on jo will not work 

В Swift 2, новое заявление, guard был добавлен, что, похоже, именно такое поведение вы хотите:

guard let jo = joseph else { // do something here } 
// jo is in scope 

Если вы застряли в Swift 1, хотя, простой способ для йо у разворачивать эти переменные без пирамиды дума:

if let variable1 = json["response"]["fieldname1"], variable2 = json["response"]["fieldname2"] { 
    var currentRecord = structure(variable1, variable2) 
    myArray.append(currentRecord) 
} else { 
    println("error") 
} 
+0

Спасибо, я собираюсь использовать решение для Swift 1. Даже я думал, что я не счастлив сделать это, так как некоторые переменные могут быть пустыми – MeV

0

Ваш код проверяет переменную2 всегда, даже переменную 1 терпит неудачу. Но что вызывает (отредактировано!) не ошибка.

Вы можете проверить и присвоить обе переменные в одной строке. «Истинный» филиал будет выполняться только тогда, когда обе переменные не являются нулевыми

let response = json["response"] 
if let variable1 = response["fieldname1"], variable2 = response["fieldname2"] { 
    let currentRecord = structure(variable1, variable2) 
    myArray.append(currentRecord) 
} else { 
    println("error") 
} 
+1

Проверка variable2 не вызывает ошибку - ничего в проверке там полагается на variable1. Он должен работать нормально. Ошибка использует обе эти переменные из их объема. – oisdk

+0

Согласен с @oisdk – MeV

+0

извинения, вы правы – vadian

1

@oisdk уже объяснил, что область видимости переменной, определяемой if let только внутри скобок этого заявления.

Это то, что вы хотите, потому что если оператор if let не работает, переменная не определена. Все дело в том, пусть позволяет безопасно разворачивать ваш факультатив, так что внутри фигурных скобок вы можете быть уверены, что переменная действительна.

Другим решением вашей проблемы (в Swift 1.2) заключается в использовании нескольких, если пусть операторы:

if let variable1 = json["response"]["fieldname1"], 
    let variable2 = json["response"]["fieldname2"] 
{ 
    //This code will only run if both variable1 and variable 2 are valid. 
    var currentRecord = structure(variable1, variable2) 
    myArray.append(currentRecord)} 
else 
{ 
    println("error") 
} 
+0

Спасибо, я собираюсь использовать решение, указанное oisdk, но все же я думал, что было лучшее решение, поскольку какая-то переменная, возможно, должна быть пустой – MeV