明らかに単純なもので作業している間、私は本当に厄介なエラーがあります。NSArray、NSUserDefaults、オプションとアンラッピングの混乱
私はNSArray
を持っています。これは、アプリが初めて起動するときに言葉で埋めます。
その後、私は、配列を使用したいので、私はクラスの内部で別の配列を宣言し、ある時点で:
var localArray = NSUserDefaults.standardUserDefaults().arrayForKey("array")!
その後、私はラベル内の単語を表示したいです。ユーザーがボタンを押すと(前/後)、次/前の単語が表示されます。かなり簡単ですね。それはありますが、どういうわけか私は本当に厄介なエラーになります。
Iは、次/前の単語のための2つの方法がある:
@IBAction func nextWord(sender: AnyObject) {
if let currentIndex = localArray.indexOf(label.text!)
{
if currentIndex == localArray.count-1
{
label.text = localArray[0] as? String
}
else
{
label.text = localArray[currentIndex+1]
}
}
}
後方に行くための他の方法は、(必要な変更を加えて)同一です。
そしてviewDidLoad
に私だけ設定ラベルのテキスト:
label.text = localArray[0] as? String
問題がif let
文です。ユーザーのデフォルトを使用する前に、ちょうどいくつかの文字列でlocalArray
を初期化しました。そしてすべてがうまくいった。しかし、ユーザーのデフォルトを追加すると、狂気が始まりました。どこにでもエラーがありましたlocalArray
は、配列がラップされていないと言っています。だから私は!
をローカルの初期化時にユーザーのデフォルト配列の後に追加しました。
しかし、最後の2つのエラー(if let
文)は意味をなさない。今度はindexOf()
メソッドがエラーを投げます。これは以前には起こりませんでした。また、文字列(label.text!)を@noescape (AnyObject) throws -> Bool
に変換できないこともわかります。
だから、私はその文字列をNSString
に変換して動作させる必要がありますか?私はユーザーのデフォルトの配列に関連する "ブリッジング"について何かを発見しました。それは私の問題ですか?
ここで私はどんなバグですか?なぜ、配列内の文字列を文字列に明示的にダウンキャストする必要がありますか?なぜindexOf
メソッドが変更されたのですか?
アンラップされたオプションの動作はオプションではありませんか?
純粋なスウィフトコードですか?その場合は、NSArrayを使用しないでください。ネイティブのコレクション型を代わりに使用します。これは、NSArrayをNSUserDefaultsに格納するために自由にブリッジできます(要素がobj-cにブリッジ可能である限り)。 – Hamish
スイフトのみです。ネイティブコレクションタイプを使用するとどういう意味ですか? – Lawrence413
まあ... [Swift自体が提供するコレクションの種類](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097 -CH8-ID105)!文字列の配列が必要な場合は、 '[String]'が必要です。 'String'は' NSString'に自由にブリッジすることができるので、配列をNSArrayに自由にブリッジすることができます。 – Hamish