新存储 属性 总是 returns 无 | iOS Swift

New stored property always returns nil | iOS Swift

使用扩展为现有 class 创建的新存储 属性。在获取价值的同时,它总是返回零值。下面的代码是我尝试添加新存储的 属性.

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)")

                }
             }
          }

有人帮我找出我犯的错误。提前致谢。

Swift 中的扩展只能添加 computed 实例属性和 computed 类型属性 https://docs.swift.org/swift-book/LanguageGuide/Extensions.html

叫做objc_setAssociatedObject。看到最后的“对象”了吗? Int 不是对象。把你的 newValue 变成一个 NSNumber 这样你就有了一个对象。所以那肯定不行。

如果您的 class 不是 @objc class,那么 可能 是个问题。

事实是 objc_getAssociatedObject/objc_setAssociatedObject 为对象实例赋值,因此它只能与该实例一起存在。由于您的自定义 属性 未被 EventKit 序列化,因此在请求后新获得的事件实例自然没有关联对象。