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

标签 ios objective-c properties swift setter

我正在尝试在属性发生变化时对其运行 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/

相关文章:

javascript - 如何动态修改某些对象属性

ios - 下拉刷新不适用于空的 TableView

iPhone 媒体播放器框架访问原始文件

iphone - 将一个(垂直的)UIPageViewController 嵌套在另一个(水平的)UIPageViewcontroller 中

c# - 在 python 中使用属性,如示例 C#

objective-c - 未找到属性/方法?

ios - 找到 UISlider 指向的方向

ios - 分享 iOS development.provision 文件

ios - 公司如何邀请我参加 TestFlight?

iphone - 用于 iOS 开发的 LLVM 与 GCC