Swift:有条件设置私人Ivar



在目标C中,我可以问"isEqual"问题,如果实例变量已经是同一个实例,则可以避免设置该实例变量。

-(void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext {
if (![_managedObjectContext isEqual:managedObjectContext]) {
    __weak NSPersistentStoreCoordinator *psc = _managedObjectContext.persistentStoreCoordinator;
    // iCloud notification subscriptions
    NSNotificationCenter *dc = [NSNotificationCenter defaultCenter];
    [dc addObserver:self
           selector:@selector(storesWillChange:)
               name:NSPersistentStoreCoordinatorStoresWillChangeNotification
             object:psc];
    [dc addObserver:self
           selector:@selector(storesDidChange:)
               name:NSPersistentStoreCoordinatorStoresDidChangeNotification
             object:psc];
    [dc addObserver:self
           selector:@selector(persistentStoreDidImportUbiquitousContentChanges:)
               name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
             object:psc];
    _managedObjectContext = managedObjectContext;
}}

这可能来自swift中var的设置者内部吗?

是的,有一点是可能的:swift缺乏Objective-c意义上的隐式ivar。你必须自己做ivar。并使用===运算符检查指针相等性。

import Foundation
class Setter: NSObject {
    private var __property: NSObject!
    var property: NSObject!{
        get {
            return self.__property
        }
        set {
            if newValue === self.__property { return }
            self.__property = newValue
        }
    }
}

有关Swift中ivar概念的详细信息,请查看此参考资料和此问题。

如果使用===检查对象是否相等,===检查两个实例是否具有相同的引用,我相信

最新更新