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