web-dev-qa-db-ja.com

NSStringをキャスト! swiftの文字列に

Stringにインスタンス変数名があります

var name: String

私のクラスはNSCodingプロトコルを実装しています。だから名前のために

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(self.name, forKey: kName)
}

required init(coder aDecoder: NSCoder) {
    self.name = aDecoder.decodeObjectForKey(kName) as String  // CRASH HERE
}

結果?デコーダーでの開始中にランタイムクラッシュが発生しました。 initをこれに変更しました:

var temp = aDecoder.decodeObjectForKey(kName) as NSString!
self.name = aDecoder.decodeObjectForKey(kName) as String

値tempが正しいNSString値を保持していることに気付きました。だから私は以下の行がそれを修正しようとしていると思ったが、リンカーエラーを発行する:

self.name = aDecoder.decodeObjectForKey(kName) as NSString!

質問は、どのように臨時雇用者を取得し、名前に入れるかです。

13
Arash

動作させるために必要なことが2つありました。

  1. 派生データフォルダーを削除してクリーンビルド
  2. 何らかの理由で、NSStringとStringの間のブリッジングはこの状況では機能しません。キャストは2段階で行う必要があります

    if let name = aDecoder.decodeObjectForKey(kName) as? NSString {
        self.name = name as String
    } else {
        assert(false, "ERROR: could not decode")
        self.name = "ERROR"
    }
    
0
Arash