为我的变量编写自定义Setter - Swift

Rya*_*yan 2 setter properties objective-c ios swift

我试图在属性发生变化时运行一个Setter,这也会影响该类中的逻辑:

以下是它在Objective-C中的用法:

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
Run Code Online (Sandbox Code Playgroud)

fetchedResultsController的Set方法:

- (void)setFetchedResultsController:(NSFetchedResultsController *)newFetchResultsContrller
{
    NSFetchedResultsController *oldfetchResultsController = _fetchedResultsController;
    if (newFetchResultsContrller != oldfetchResultsController) {
        _fetchedResultsController = newFetchResultsContrller;
        newFetchResultsContrller.delegate = self;
        if ((!self.title || [self.title isEqualToString:oldfetchResultsController.fetchRequest.entity.name]) && (!self.navigationController || !self.navigationItem.title)) {
            self.title = newFetchResultsContrller.fetchRequest.entity.name;
        }
        if (newFetchResultsContrller) {

            [self performFetch];
        } else {

            [self.tableView reloadData];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在斯威夫特的尝试.但是我无法获取newFetchResultsController,因此无法完成休息.这是在swift中设置属性的正确方法吗?如何在Swift的Objective C中执行与上面相同的原理?

var fetchedResultsController:NSFetchedResultsController! {
    willSet {
        println("Set fetchedResultsController Called")
        self.fetchedResultsController.delegate = self
        performFetch()
    }
}
Run Code Online (Sandbox Code Playgroud)

MAN*_*rii 6

UPD:
今天使用Swift 3.0你的逻辑可以重新实现,你可能有一个普通的存储属性,只有didSet像这样指定的值观察者:

var fetchedResultsController:NSFetchedResultsController? {
    didSet(oldfetchResultsController) {
        // If value BEFORE it was set is not identical to value AFTER it was set.
        if oldfetchResultsController !== fetchedResultsController {
            // Let's assume there is such method.
            if fetchedResultsController.isBadAndNotSuitable == false {
                // Do your stuff here.
            } else {
                // If you want to override value that was set
                // without observers being called, you can just set
                // your property inside didSet like:
                fetchedResultsController = nil
                // Or, if you don't want to change value:
                fetchedResultsController = oldFetchedResultsController
                // this won't cause willSet to fire and your property
                // will preserve its value.
                // It's ok to override observers in subclasses, because
                // super's implementation will be called as well before.
            }
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

和2014年一样:
你可以这样写:

var _fetchedResultsController:NSFetchedResultsController? = nil
var fetchedResultsController:NSFetchedResultsController? {
    get {
        return _fetchedResultsController
    }
    set (aNewValue) {
        if (_fetchedResultsController != aNewValue)
        {
            _fetchedResultsController = aNewValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此方法可以防止设置值.因此,例如,如果有一个NSFetchedResultsController被调用的属性,isBadAndNotSuitable你可以写:

set (aNewValue) {
    if (aNewValue.isBadAndNotSuitable)
    {
        NSLog("Don't set, it's bad")
    }
    else
    {
        _fetchedResultsController = aNewValue
    }
}
Run Code Online (Sandbox Code Playgroud)