如何将关联对象与枚举一起使用?

阿德里安

我有一个ViewController,使用关联的对象向其中添加了两个新属性:枚举和字符串(字符串版本从此处获取

这是我的示例代码:

extension UIViewController {

    private struct AssociatedKeys {
        static var handle = "handle"
    }

    enum CustomStringEnum: String {
        case One = "One"
        case Two = "Two"
        case Three = "Three"
    }

    var customEnum: CustomStringEnum {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.handle) as? CustomStringEnum ?? .One
        }
        set {
            objc_setAssociatedObject(self, &AssociatedKeys.handle, newValue.rawValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    var descriptiveName: String {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.handle) as! String
        }

        set {
            objc_setAssociatedObject(
                self,
                &AssociatedKeys.handle,
                newValue as NSString?,
                .OBJC_ASSOCIATION_RETAIN_NONATOMIC
            )
        }
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let vc = UIViewController()
        vc.customEnum = .Three
        vc.descriptiveName = "Three"

        print(vc.customEnum.rawValue) // -> This prints "One"
        print(vc.descriptiveName)     // -> This prints "Three"
    }
}

字符串版本可以正常工作,但枚举版本却不能。我不确定是什么问题。

objc_getAssociatedObject或的问题objc_setAssociatedObjectget版本似乎一直都是nil,因此返回默认值One。

狮子座

将您的代码更改为此

extension UIViewController {

private struct AssociatedKeys {
    static var handle = "handle"
    static var enumContext = "enumContext"
}

enum CustomStringEnum: String {
    case One = "One"
    case Two = "Two"
    case Three = "Three"
}

var customEnum: CustomStringEnum {
    get {
        let rawvalue = objc_getAssociatedObject(self, &AssociatedKeys.enumContext)
        if rawvalue == nil{
            return .One
        }else{
            return CustomStringEnum(rawValue: rawvalue as! String)!;
        }
    }
    set {
        objc_setAssociatedObject(self, &AssociatedKeys.enumContext, newValue.rawValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}

var descriptiveName: String {
    get {
        return objc_getAssociatedObject(self, &AssociatedKeys.handle) as! String
    }

    set {
        objc_setAssociatedObject(
            self,
            &AssociatedKeys.handle,
            newValue as NSString?,
            .OBJC_ASSOCIATION_RETAIN_NONATOMIC
        )
    }
}
}

这样就可以了

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将枚举与分组和子分组层次结构/嵌套一起使用

如何将Gson TypeAdapter与Mockito模拟的对象一起使用?

角度2:如何将JavaScript Date对象与NgModel双向绑定一起使用

如何将本地JSON对象与angular-datatables一起使用

如何将Structuremap 3与对构造函数注入不友好的对象一起使用?

如何将array_push与关联数组和索引键一起使用?

如何将std :: sort与没有复制构造函数的对象一起使用?

如何将@InjectMocks和initMocks()与具有必需String参数的对象一起使用?

如何将Math.max与一系列对象一起使用?

如何将findIndex与字符串和对象一起使用

如何将“ with”与对象列表一起使用

如何将flags属性与从枚举继承的类一起使用

如何将非静态特征对象与关联类型一起使用?

如何将os.DirEntry对象与pandas read_csv()一起使用?

在Django中获取相关对象以及如何将Prefetch与相关模型一起使用

如map所支持的,如何将filter与多个可迭代对象一起使用?

如何将Svelte存储与树状嵌套对象一起使用?

如何将useState与对象一起使用?

如何将Django的APIRequestFactory与一系列对象一起使用?

如何将IN与块而不是对象一起使用?

如何将ngRepeat与对象一起使用?

如何将 Boost Variant 与 struct 对象一起使用 C++

如何将 processStrategy 与对象模式一起使用

如何将某些过滤器与恢复初始对象一起使用?

如何将数据表与数据对象一起使用?

如何将“锚点”与关联文本(不可链接)一起使用

如何将 summary() 与 lqmm 和公式对象一起使用

如何将具有关联值的枚举与可编码协议一起使用?

如何将通用对象工具与通过 Typescript 中的接口描述的对象一起使用?