2016-06-26 1 views
1

NSDateの拡張を試みました。 「EXC_BAD_INSTRUCTION:私が望んでいたことはNSDateは、だから私は遊び場Swift拡張例外実行が中断されました。理由:EXC_BAD_INSTRUCTION(コード= EXC_I386_INVOP、サブコード= 0x0)

//: Playground - noun: a place where people can play 

import UIKit 

var str = "Hello, playground" 



extension NSDate { 
    private struct RemovalInformation { 
     static var removed: Bool = false 
    } 
    var removed: Bool { 
     get { 
      return (objc_getAssociatedObject(self, &RemovalInformation.removed) as! Bool) 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &RemovalInformation.removed, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 
} 

let date = NSDate() 
print("The Date is: \(date)") 

if(date.removed == true) { 
    print ("removed") 
} 

でこれを試してみました。しかしラインif(date.removed == true)は、私がどのように対処するか見当もつかないエラーが発生し、後に

除去されなければならないかどうかを示すフラグです(コード= EXC_I386_INVOP、サブコード= 0x0の)」

enter image description here

答えて

3

objc_getAssociatedObject戻りnilないオブジェクトが関連されていない場合210からNSDateに変更され、強制キャストas! Boolがクラッシュします。

をあなたが財産をオプションにすることができます(関連するオブジェクトが設定されているが、その 値はBoolに変換できない場合にもクラッシュしていました。):

var removed: Bool? { 
    get { 
     return objc_getAssociatedObject(self, &RemovalInformation.removed) as? Bool 
    } 
    set(newValue) { 
     objc_setAssociatedObject(self, &RemovalInformation.removed, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
    } 
} 

か、デフォルト値を提供し、例えば&RemovalInformation.removedのみ一意に関連付けられているオブジェクトを識別するメモリアドレス として機能する

var removed: Bool { 
    get { 
     return objc_getAssociatedObject(self, &RemovalInformation.removed) as? Bool ?? false 
    } 
    set(newValue) { 
     objc_setAssociatedObject(self, &RemovalInformation.removed, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
    } 
} 

注:ゼロ-合体オペレータ??を使用。その 静的なプロパティとその型の内容は無関係で、まったく使用されません。特に、オブジェクトの関連付けは、そのプロパティの値で「初期化」されません。

+0

おかげで、あなたは私の一日を作った。私はそれがちょっとしたことかもしれないと思ったが、私が完全に理解できるように、全体の表現は私にはあまりにも新しかった。あなたが言及したことで、私はすべてのことを間違いなく理解しています。ありがとう。 –

関連する問題