2017-01-29 5 views
1

これは私が達成しようとしているのは2つのテキストフィールドがあり、ユーザー名テキストフィールド.isEmptyまたはパスワードフィールド.isEmptyの場合はprint()というメッセージをコンソールに送信します。私が気づいた最初のことは、テキストフィールドはもちろん空でもかまわないのでオプションです。だから誰も私にいくつかの構文と推論の次のコードサンプルの背後に説明することができますか?オプションとアンラップ

Q1:.isEmptyの後に、なぜ私はアンラップする必要がありますか?

if(self.username.text?.isEmpty)! { 
    print("Something!") 
} 

質問2:または演算子を組み込むときに、この構文が機能しないのはなぜですか?

if(self.username.text?.isEmpty || self.password.text?.isEmpty)! { 
    print("Please provide username and password!") 
} 

Q3:なぜ私は.isEmpty直後にアンラップすることはできませんか?

if(self.username.text?.isEmpty! || self.password.text?.isEmpty!) { 
    print("Please provide username and password!") 
} 
+1

これは役立つかもしれません:[オプションの連鎖参照](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html) – nathan

答えて

0

Q1:なぜ私は.isEmpty後アンラップしなければなりませんか?

if(self.username.text?.isEmpty)! { 
    print("Something!") 
} 

if文の構造の力あなたは簡単にするために、体内でtrue/falseを持っている:

let condition = false 

if condition {...} 

この文self.username.text?.isEmptyのラップを解除するときは、私はそれは決してしないことを約束する」コンパイラを言っていますnil "でも可能です。

Q2:または演算子を組み込むときに、この構文が機能しないのはなぜですか?

オペレータor/andの入力がないnil(開封)でなければならない前と同じ理由。

以下の行に注意してください。この文を試して評価すると、2つのオプションをパラメータとしてブール値をアンラップしようとしていることがわかります。

if(self.username.text?.isEmpty || self.password.text?.isEmpty)! { 

Q3:なぜ私は.isEmpty直後にアンラップすることはできませんか?

ここでは、あなたが提示した問題に基づいて推測しています。

isEmptyはオプションではありませんが、true/falseにすることができますので、アンラップできません。

この文self.username.text?.isEmptyはオプションです。true/false/nilとすることができ、アンラップすることができます。

私はそれが物事をより明確にするのに役立つことを望みます。 optionalsについて読んで、Appleのコード例を分析すると、さらに多くの助けになるかもしれません。

2

Q1textプロパティはnilことができるので、あなたは、アンラップしなければなりません。これはおそらく有効な値なのかもしれません。Objective-C変換のアーティファクトであり、実際はnil_resettableです。

!を使用すると、テキストにアクセスするたびにクラッシュする可能性があるため、設定しないと安全ではありません。

この

if self.username.text?.isEmpty == false { 
    print("Something!") 
} 

ような何か必要なタイプがオプションである場合スウィフトは、オプションのプロモーションへの暗黙的な非オプションを持ってしてみてください。

最初はBool? == Boolであり、それはBool? == Bool?

Q2に変更しました:あなたがまたはオペレータを含む場合、なぜこの構文は動作しませんか?

let a: Bool? = self.username.text?.isEmpty 
let b: Bool? = self.password.text?.isEmpty 
let c = a || b // the problem here is that `Bool?` doesn't implement 
       // the operator `||` as it's not clear how this would 
       // work with optionals. 

あなたは何をしたい:

guard let username = self.username.text, 
    let password = self.password.text, 
    !username.isEmpty, 
    !password.isEmpty { 

    print("Please provide username and password!") 
    return 
} 

// code using username as String and password as String (not optionals) 

Q3

あなたは括弧で囲むを修正する必要があります。

if (self.username.text?.isEmpty)! || (self.password.text?.isEmpty)! { 
    print("Please provide username and password!") 
} 

生産コードに!を使用しないように注意してください。これは危険です。 Q2の亜種を使用してください。

関連する問題