我正在尝试在属性发生变化时对其运行 Setter,这也会影响该类中的逻辑:
这是它在 Objective - C 中的样子:
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
为 fetchedResultsController 设置方法:
- (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];
}
}
}
这是我在 Swift 中的尝试。但是我无法获得 newFetchResultsController,因此无法完成休息。这是在 swift 中设置属性的正确方法吗?如何在 Swift 中执行与上述 Objective C 中所示相同的原理?
var fetchedResultsController:NSFetchedResultsController! {
willSet {
println("Set fetchedResultsController Called")
self.fetchedResultsController.delegate = self
performFetch()
}
}
最佳答案
更新:
今天使用 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.
}
}
}
}
2014 年情况:
你可以这样写:
var _fetchedResultsController:NSFetchedResultsController? = nil
var fetchedResultsController:NSFetchedResultsController? {
get {
return _fetchedResultsController
}
set (aNewValue) {
if (_fetchedResultsController != aNewValue)
{
_fetchedResultsController = aNewValue
}
}
}
通过这种方法,您可以防止设置值。因此,例如,如果 NSFetchedResultsController
上有一个名为 isBadAndNotSuitable
的属性,您可以这样写:
set (aNewValue) {
if (aNewValue.isBadAndNotSuitable)
{
NSLog("Don't set, it's bad")
}
else
{
_fetchedResultsController = aNewValue
}
}
关于ios - 为我的变量编写自定义 Setter - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529423/