2016-10-27 13 views
-1

私はオプションのパラメータ(位置)を持つ関数を持っています。私はそれが無限であることをテストしますが、Xcodeはエラーを表示します: "オプションの型Intの値はアンラップされていません"と私に "!"または "?"。Swiftオプションのパラメータがアンラップされていない

var entries = [String]() 

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

私はSwiftに新しいと私はなぜこれはokではない理解していない。このif節の中でコンパイラは、位置が定義されていることを100%確実にする必要がありますか?

+0

どのラインでエラーが表示されますか? – Koen

+0

「位置」の項目[位置] =テキスト「 – 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節を作って以来、なぜそれがnilではないことを知っているのでしょうか? (あなたの2番目のコードを参照してください) – Mick

+0

'position == nil'thisは値をnilと比較しませんが、オプションでnilでnilを持つ可能性があります。 'position!'または 'let let position = position'でこの値にアクセスしています。あなたは* unwrap * it @Mick – vikingosegundo

+2

私は2番目の例を避け、もし可能ならば 'Optional'をアンラップします。いつの間にか、チェックを外してランタイムのバグを公開する可能性があります。オプションのアンラッピングは、コンパイラがコンパイル時にそれをチェックできるので安全です。 – ColGraff

0

あなたはnilのチェックにもかかわらず、あなたはまだとして使用するIntInt?に変換していませんインデックス。これを行うには、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 
} 
関連する問題