6

現在SwiftKeychainWrapperを使用しているアプリがあります。以下は、 であるかどうかをチェックするコードretrievedStringですnil。しかし、私はまだretrievedString: nilコンソールに入っています。

if-let ステートメントのコードを実行してはいけませんか、それとも if-let の使用/理解が間違っていますか?

与えられた例では、if-let を使用してオプションの値をアンラップする正しい方法は何ですか?

if let retrievedString: String? = KeychainWrapper.stringForKey("username") {
    print("retrievedString: \(retrievedString)")
    //value not nil
} else {
    //Value is nil
}
4

2 に答える 2

10

これは、オプションの String の値String? KeychainWrapper.stringForKey("username")を別のオプションの Stringに設定しているためですretrievedString

String?aを別のに設定しようとするとString?、値が であっても if let チェックは常に成功しますnil。これは、両方の型が同じであり、どちらも nil 値を受け入れることができるためです。

代わりに、オプションの文字列をオプションでString?はない文字列に設定するようにしてくださいStringStringSwift が非オプションをに設定しようとするとnil、非オプションは nil 値を持つことができないため、失敗します。その後、コードはelseステートメントに続きます

使用する必要があります

//notice the removal of the question mark
//                            |
//                            v
if let retrievedString: String = KeychainWrapper.stringForKey("username") {
    print("retrievedString: \(retrievedString)")
    //value not nil
} else {
    //value is nil
}
于 2016-02-20T02:33:05.090 に答える
4

のタイプをretrievedStringオプションに設定しています。チェックの要点は、オプションを削除してString.

if let retrievedString: String = KeychainWrapper.stringForKey("username") {
    print("retrievedString: \(retrievedString)")
    //value not nil
} else {
    //Value is nil
}
于 2016-02-20T02:33:17.627 に答える