2015-08-31 8 views
1

Я новичок в быстрой и теперь изучаю из этой книги, которая называется Язык быстрого программирования. В книге есть пример:Быстрая проблема с примером

enum Rank: Int { 
case Ace = 1 
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten 
case Jack, Queen, King 
func simpleDescription() -> String { 
    switch self { 
    case .Ace: 
     return "ace" 
    case .Jack: 
     return "jack" 
    case .Queen: 
     return "queen" 
    case .King: 
     return "king" 
    default: 
     return String(self.rawValue) 
    } 
} 
} 

А вот часть я не понимаю:

if let convertRank = Rank(rawValue: 3){ 
    let description = convertRank.simpleDescription() 
} 

Я попытался изменить код выше этого:

let convertRank = Rank(rawValue: 3) 
let description = convertRank.simpleDescription() 

В основном , Я только что удалил оператор if, но затем возникает ошибка: Значение необязательного 'ранга?' не разворачивается; вы хотели использовать '!' или '?'?

Почему я должен использовать инструкцию if? И я не совсем понимаю, что говорит об ошибке.

+0

Есть [несколько] (http://stackoverflow.com/questions/25799529/value-of-optional- type-string-not-unwrapped) [похоже] (http://stackoverflow.com/questions/29373958/swift-error-value-of-optional-type-double-not-unwrapped) [вопросы] (http: // stackoverflow.com/questions/25662595/value-of-optional-type- CGFloat-не-развернутые ошибки в-Свифт). Разве они не ответили на ваш вопрос? – Marty

ответ

2

if let является специальным structure в Swift, что позволяет проверить, имеет ли значение «Дополнительно» значение, а в случае его действия - сделать что-то с развернутым значением.

В вашем случае:

if let convertRank = Rank(rawValue: 3){ 
    let description = convertRank.simpleDescription() 
} 

if let структура разворачивает Rank(rawValue: 3) (то есть проверяет, есть ли значение, сохраненное и принимает это значение) и сохраняет свое значение в постоянной convertRank. Вы можете использовать convertRank внутри первой ветви if. Обратите внимание, что внутри if вам больше не нужно использовать ? или !.

В вашем втором случае:

let convertRank = Rank(rawValue: 3) 
let description = convertRank.simpleDescription() 

Вы можете разворачивать convertRank таким образом:

let description = convertRank!.simpleDescription() 

Попытка использовать ! доступ к несуществующей факультативное значение вызывает ошибки в выполнения. Всегда удостоверяйтесь, что опционально содержит значение non-nil перед использованием !, чтобы принудительно развернуть его значение.

Но ниже код будет работать так же, как if let:

let description = convertRank?.simpleDescription() 

И программа не будет вылетать, если convertRank является nil.


Подробнее Объяснение:

+0

Благодарим вас за интерпретацию. Это действительно помогает мне понять ошибку, но у меня есть еще один вопрос. Всегда ли мы используем «?» вместо "! "? Есть ли какое-то преимущество в использовании «!»? –

0

Потому что это Дополнительно и вы должны развернуть перед использованием. Вы можете прочитать о Вариантыhere.

let description = convertRank?.simpleDescription() будет работать.