1

NSDate を拡張しようとしました。私が欲しかったのは、後で NSDate を削除する必要があるかどうかを示すフラグです

だから私は遊び場でこれを試しました

//: 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_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)」

ここに画像の説明を入力

4

1 に答える 1

3

objc_getAssociatedObjectnilオブジェクトが に関連付けられていない場合は が返さ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)
    }
}

または、たとえば nil-coalescing operator を使用して、デフォルト値を提供します??

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)
    }
}

&RemovalInformation.removed関連するオブジェクトを一意に識別するメモリアドレスとしてのみ機能することに注意してください。その静的プロパティの内容とその型は無関係であり、まったく使用されません。特に、オブジェクトの関連付けは、そのプロパティの値で「初期化」されません。

于 2016-06-26T19:26:31.047 に答える