2016-10-27 5 views
-1

У меня есть функция с необязательным параметром (положением). Я тестирую, чтобы это было ноль, но Xcode показывает мне ошибку: «Значение необязательного типа Int? Un unwrapped» и предлагает мне использовать «!». или "?".Быстрый необязательный параметр, не развернутый

var entries = [String]() 

func addEntry(text: String, position: Int?) { 
    if(position == nil) { 
     entries.append(text) 
    } else { 
     entries[position] = text 
    } 
} 

Im новый для Swift и не понимаю, почему это не нормально. Внутри этого if-предложения компилятор должен быть на 100% уверен, что позиция определена, или?

+0

Какая строка дает вам эту ошибку? – Koen

+0

'entries [position] = text' for" position " – Mick

+4

Посмотрите * Дополнительное связывание * в [руководстве по языку Swift] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/ Swift_Programming_Language/TheBasics.html # // apple_ref/DOC/UID/TP40014097-CH5-ID330). – Hamish

ответ

3

Есть несколько способов, чтобы закодировать это правильно:

func addEntry(text: String, position: Int?) { 
    // Safely unwrap the value 
    if let position = position { 
     entries[position] = text 
    } else { 
     entries.append(text) 
    } 
} 

или:

func addEntry(text: String, position: Int?) { 
    if position == nil { 
     entries.append(text) 
    } else { 
     // Force unwrap since you know it isn't nil 
     entries[position!] = text 
    } 
} 
+0

Спасибо! Но почему компилятор уже не знает, что это не ноль, так как я сделал предложение if? (ссылаясь на ваш второй код) – Mick

+0

'position == nil'this не сравнивает значение с nil, но необязательно, которое может содержать нуль с nil. с 'position!' или 'if let position = position' вы получаете доступ к этому значению. вы * разворачиваете * это @Mick – vikingosegundo

+2

Я бы избежал второго примера, чтобы развернуть «Необязательный», если это вообще возможно. Когда-нибудь по дороге вы можете удалить чек и выявить возможную ошибку времени выполнения. Дополнительное развертывание более безопасно, потому что компилятор может проверить его во время компиляции. – ColGraff

0

Даже если вы проверили на nil вы до сих пор не превратили Int? в Int для использования в качестве индекс. Для этого вам необходимо развернуть Optional:

var entries = [String]() 

func addEntry(text: String, position: Int?) { 
    // guard against a nil position by attempting to 
    // unwrap it with optional binding 
    guard 
    // test for nil and unwrap using optional binding 
    let unwrappedPosition = position, 
    // make sure the position isn't 
    // past the end of the array 
    unwrappedPosition < entries.count else { 
     // can't unwrap it or 
     // it's out of bounds, 
     // append it 
     entries.append(text) 
     return 
    } 

    // successfully unwrapped, set item at index 
    entries[unwrappedPosition] = text 
}