Ios Swift扩展异常执行被中断,原因:EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)

Ios Swift扩展异常执行被中断,原因:EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0),ios,swift,nsdate,swift-extensions,exc-bad-instruction,Ios,Swift,Nsdate,Swift Extensions,Exc Bad Instruction,我已尝试将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 =

我已尝试将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")
}
但行
如果(date.removed==true)
产生一个错误,我不知道如何处理:“EXC\u BAD\u指令(code=EXC\u I386\u INVOP,subcode=0x0)”


objc\u getAssociatedObject
如果没有对象被关联,则返回
nil
NSDate
,然后强制转换为!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)
    }
}
或提供一个默认值,例如,使用零合并运算符
??

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
仅用作内存地址 唯一地标识关联对象。内容是什么
静态属性及其类型无关,根本不使用。特别是,对象关联不是用该属性的值“初始化”的

谢谢你,伙计,你让我开心。我认为这可能是一件小事,但整个表情对我来说太陌生了,因为我完全能理解。根据你提到的,我肯定对整个事情有了更多的了解。谢谢你,伙计。