ファーストフードwift言語の学習ノート2(オプションタイプ?と隠しタイプオプションタイプ!)


著者:fengsh 998
原文の住所:http://blog.csdn.net/fengsh998/article/details/28904115
転載は出典を明記してください.
文章があなたのために役に立つと思うなら、メッセージやWeChat公式アカウントを通じて(通って)fengsh 998を応援してください.ありがとうございます.
オプションのタイプ、暗黙のタイプ
swiftでは、オプションタイプのルーツはエニュメレート・タイプで、中にはNoneとSomeの2種類があります.nilとはOptional.Noneのことです.非nilとはOptional.Someのことです.そして、Some(T)包装(wrap)の元の値を使います.これはなぜOptionalを使う時にカバンを外しますか?(enumから元の値を取り出します)の原因です.また、PlayGroundがOptional値を似たように表示します.
enum Optional<T> : LogicValue, Reflectable {
    case None
    case Some(T)
    init()
    init(_ some: T)

    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool

    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> Mirror
}
文法は「?」の操作符と「!」の操作符を使います.
例えば:「var optional String:String?」 「ハロー」optional String==nil var optional Name:String?=「John Appleesed」var greeting=「Hello!」if let name=optional Name{    greeting=「Hello、\(name)」みんなはoptional Nameをnilに変えた時、どのような結果がありますか?理解するなら?後はオプションの値です.つまり、私たちの変数がnilの場合、ここにありますか?操作すると?後の値はデフォルトとしてnil.これなど環境がある場合は検証してください.
経験証:
それぞれ実行:
        var optional :String? = "ok good";//  ? =      ?              
        println(optional)
出力:
ok good
を選択します
        var optional :String?//  ? =      ?              
        println(optional)
出力:
nil
見に来てください日には暗黙的に解凍されます.主に一つの変数/定数が定義された瞬間に完了すると必ず存在する場合に使用されます.これは主にクラスの初期化過程で使われます.
官風の例:
let possibleString: String? = "An optional string."
println(possibleString!) // requires an exclamation mark to access its value
// prints "An optional string."

let assumedString: String! = "An implicitly unwrapped optional string."
println(assumedString) // no exclamation mark is needed to access its value
この例のとおりに実行しても、何も見えないです.結論が出ません.だから自分でZ磨して英語の通訳を理解してみます.また自分で操刀して練習します.次の結論を出します.
        var optionVariables:String? //?             
        //var optionVariables : Optional<Int>
        let value = optionVariables?.hashValue
        /*
        optionVariables         ,  optionVariables nil, hashValue  nil
          optionVariables  nil,hashValue  strValue       
                ?       :
        1.  Optional   
        2.   Optional    ,              
        */
        
        //        ,        ,     
        //let hashval = optionVariables.hashValue //'String?' does not have a member named 'hashValue'
        //           ,     
        //   :  if let/var xxx = 
        if let hv = optionVariables
        {
            //run ok;
        }
        
        //   :  ! 
        let hv = optionVariables!.hashValue
        
        //   !  “       strValue    nil ,     ” ,      :
        
        if optionVariables {
            let hashv = optionVariables!.hashValue
        }
        //{}  optionVariables    nil ,        !,    (unwrap)        
変数または定数の後に加算されますか?のはすべて1つのオプション変数/オプションの定数です.変数または定数の後に加えます.のいずれも暗黙的なオプション変数/定数であり、最初にこの変数または定数はオプションタイプを満たしています.これは主に一般的な変数/定数で使用できますが、毎回値があるかどうかを検証する必要はありません.
注:もし1つの暗黙的な解凍のオプションタイプが1つの実際値を含まない場合、そのアクセスは実行時のエラーをスローします.変数/定数名の後ろに追加します.の場合も同じです.
        var possibleString: String? = "An optional string."
        //possibleString = nil
        println(possibleString) // possibleString      ,    !     
分析:まずpossible Stringは後ろから持ってきました.これはオプションであり、前にvarを変数として追加するので、これはオプション型の変数です.そのオプション値が「An optionl string.」であることから、printlnの実行を見てみると、An optional stringとして出力されていることが分かります.また、printlnという言葉を変えてみます.
<span style="font-size:18px;">println(possibleString!) // possibleString      ,    !     </span>
ここで結果はプラスしていません!号の時は全く同じです.出力はAn optional stringです. 
はい、今は重点的に来ました.これは大切なテストです.possible String=nilというコメントを放して動かしてください.別のprintlnバンドを見てください.と持たないの場合:
ケース1:持ってない!号の場合、出力はnil.
<span style="font-size:18px;">        var possibleString: String? = "An optional string."
        possibleString = nil
        println(possibleString) </span>
状況二:もう少し見に来てください.番号
<span style="font-size:18px;">        var possibleString: String? = "An optional string."
        possibleString = nil
        println(possibleString!) // possibleString      ,    !     </span>
この時にこのprintlnを実行するとcrashします.会報
fatal error:Can't unwrap Optional.None
エラー. 
一時的には、なぜエラーが発生しないのかというと、これはオプション変数であり、変数がnilである場合には、オプションの値があるかどうかを自動的に検証し、ある場合はオプションの値を使用します.アクセス符はpossible String変数にアクセスしますが、possible Stringはnilに設定されていますので、実際の値は含まれていません.以下のように使用します.日に声明したのも同じです.
<span style="font-size:18px;">        var assumedString: String! = "An implicitly unwrapped optional string."
        assumedString = nil
        println(assumedString!)</span>
同報:fatal error:Can't unwrap Optional.None
オプションタイプを定義して初期値を与えない場合は、デフォルトではnilvar surveyAnswer:String?最初は自動的にnilに設定されました.SwiftのnilはObject-Cのnil.Object-Cとは異なり、nilはポインタが存在しないオブジェクトを指しています.Swiftでは、nilはポインタではなく、特定のタイプの空の値です.任意の種類のオプション変数はnilに設定できます.ポインタだけではありません.
swiftではどの変数/定数の声明にも初期値が必要です.そうでないと選択可能な宣言が必要です.
つまりvar btn:UUButtonはこのようにコンパイルされています.いくつかの理由でバンド初期化に変更しなければならない場合:
var btn 2:UButton = UUButon()
それとも使いますかとを選択します
したがって、オプションまたは暗黙的オプション変数をしばしば宣言します.
var btn:UUButton     //標準btn=nil
var edt:UICText Field! //デフォルトのedt=nil
いつ使いますか?どんな場合に使いますか?号は変数を拘束していますが、まだ真の原理を悟っていません.
だから、自分の何回かの検証を通して、皆さんの理解を助けます.
<span style="font-size:18px;">        var btn  :UIButton?      //   btn = nil
        var btn2 :UIButton = UIButton()    //           
        var btn3 :UIButton!     //   btn = nil
        //var btn4 :UIButton    //               
        //     fatal error: Can't unwrap Optional.None  btn = nil
        btn!.tintColor = UIColor.blackColor()
        btn!.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
        btn!.frame = CGRectMake(0,0,50,40)
        
        //    
        btn2.tintColor = UIColor.blackColor()
        btn2.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
        btn2.frame = CGRectMake(0,0,50,40)
        
        //     fatal error: Can't unwrap Optional.None  btn3 = nil
        btn3.tintColor = UIColor.blackColor()
        btn3.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
        btn3.frame = CGRectMake(0,0,50,40)</span>
そのため、運行期間のために、次のように変更できます.
<span style="font-size:18px;">        var btn  :UIButton?      //   btn = nil
        var btn2 :UIButton = UIButton()    //           
        var btn3 :UIButton!     //   btn = nil
        
        //     fatal error: Can't unwrap Optional.None  btn = nil
        if var tmpbtn = btn
        {
            btn!.tintColor = UIColor.blackColor()
            btn!.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
            btn!.frame = CGRectMake(0,0,50,40)
        }
        
        //    
        btn2.tintColor = UIColor.blackColor()
        btn2.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
        btn2.frame = CGRectMake(0,0,50,40)
        
        //     fatal error: Can't unwrap Optional.None  btn3 = nil
        if var tmpbtn = btn
        {
            btn3.tintColor = UIColor.blackColor()
            btn3.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
            btn3.frame = CGRectMake(0,0,50,40)
        }</span>
または
<span style="font-size:18px;">        var btn  :UIButton?      //   btn = nil
        var btn2 :UIButton = UIButton()    //           
        var btn3 :UIButton!     //   btn = nil
        
        //     fatal error: Can't unwrap Optional.None  btn = nil
        if btn
        {
            btn!.tintColor = UIColor.blackColor()
            btn!.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
            btn!.frame = CGRectMake(0,0,50,40)
        }
        
        //    
        btn2.tintColor = UIColor.blackColor()
        btn2.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
        btn2.frame = CGRectMake(0,0,50,40)
        
        //     fatal error: Can't unwrap Optional.None  btn3 = nil
        if btn3
        {
            btn3.tintColor = UIColor.blackColor()
            btn3.imageEdgeInsets = UIEdgeInsets(top:1,left:2,bottom:3,right:4)
            btn3.frame = CGRectMake(0,0,50,40)
        }</span>
注:1つのオプションタイプが値なしの可能性がある場合は、デバッグ(暗黙的)オプションタイプを使用するべきではない.この場合は、必ず通常のオプションタイプを使用します.
この言葉は個人的には、var view:UID Viewのように理解しています.私のアプリケーション全体やクラス全体にview=nilが存在しない場合はvar view:UID Viewに設定できます.そうでなければ、var view:UID Viewとして宣言できますか?