gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 13:01:35 25 4
gpt4 key购买 nike

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

这是我的示例代码:

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_getAssociatedObjectobjc_setAssociatedObject 有问题。 get version 好像一直都是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
)
}
}
}

然后就可以了

关于ios - 如何将关联对象与枚举一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33708320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com