【问题标题】:Swift Extension exception Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)Swift 扩展异常执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
【发布时间】:2016-06-26 19:17:28
【问题描述】:

我尝试对 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)”

【问题讨论】:

    标签: ios swift nsdate swift-extensions exc-bad-instruction


    【解决方案1】:

    objc_getAssociatedObject 如果没有关联对象,则返回 nilNSDate,然后强制转换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 运算符 ??:

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

    【讨论】:

    • 谢谢哥们,你让我开心。我认为这可能是一件小事,但整个表达对我来说太新了,我完全可以理解。有了你提到的,我肯定对整个事情有了更多的了解。谢谢大佬。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多