如何解决新的存储属性始终返回nil | iOS Swift
为使用扩展名而存在的类创建的新存储属性。在获取值时,它始终返回nil值。下面的代码是我试图添加新的存储属性的内容。
var IdentifiableIdKey = "kIdentifiableIdKey"
extension EKEvent {
public var customId: Int {
get {
return (objc_getAssociatedobject(self,&IdentifiableIdKey) as? Int) ?? 0
}
set {
print("\(newValue)")
objc_setAssociatedobject(self,&IdentifiableIdKey,newValue,.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
利用率
let eventStore = EKEventStore()
let calendars = eventStore.calendars(for: .event)
for calendar in calendars {
if calendar.title == "Events" {
let oneMonthAgo = NSDate(timeIntervalSinceNow: -30*24*3600)
let oneMonthAfter = NSDate(timeIntervalSinceNow: +30*24*3600)
let predicate = eventStore.predicateForEvents(withStart: oneMonthAgo as Date,end: oneMonthAfter as Date,calendars: [calendar])
let events = eventStore.events(matching: predicate)
for event in events {
print("evnet id \(event.customId)")
}
}
}
有人帮助我发现我犯的错误。预先感谢。
解决方法
事实是objc_getAssociatedObject/objc_setAssociatedObject
为对象实例分配了一个值,因此该值只能在该实例中存在。由于您的自定义属性未由EventKit序列化,因此请求后新获得的事件实例很自然就没有关联的对象。
Swift中的扩展只能添加计算实例属性和计算类型属性https://docs.swift.org/swift-book/LanguageGuide/Extensions.html
,它称为objc_setAssociatedObject。看到“对象”末了吗?一个Int不是对象。将您的newValue转换为NSNumber,以便您有一个对象。所以那绝对是行不通的。
如果您的班级不是@objc类,可能会是 问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。