【发布时间】:2022-01-12 04:06:09
【问题描述】:
在我项目的一个视图控制器文件中,有两个函数,一个在viewdidload中调用,另一个由Notification和observers调用。这些函数做同样的事情,我想知道我是否摆脱了其中一个函数,尤其是前面没有使用 @objc 的那个。 (否则会出错)
override func viewDidLoad() {
super.viewDidLoad()
configureNotifications()
displayItems()
}
func displayItems() {
fetchLiveEvents { [weak self] in
self?.applySnapshot(animatingDifferences: true)
}
}
func configureNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(updateExistingItem), name: .updateExistingItem, object: nil)
}
@objc func updateExistingItem() {
fetchLiveEvents { [weak self] in
self.applySnapshot(animatingDifferences: true)
}
}
由于我使用的是通知慢跑,我无法摆脱 updateExistingItem 函数前面的@objc。但是,updateExistingItem 和 displayItems 正在做一些事情,所以我觉得这有点多余,我想从 viewDidLoad 中删除 displayItems 函数,并在 viewdidLoad 中调用 updateExistingItem(可能会更改名称)。
在 Swift 编程中是否有任何约定可以在 @objc 和普通函数做同样的事情时保持它们?还是只是个人喜好,离开他们两个都没关系?
【问题讨论】:
-
@objc的那个用于调用#selector的函数。 -
是的,所以我必须使用
@objc func updateExistingItem来调用带有#selector的函数。而不是在viewdidload中调用displayItems,当我在viewdidload中写updateExistingItem()时,它也可以工作。所以我想知道在不使用选择器的情况下使用@objc调用函数是否可以。如果这不是理想的调用方式,我会在文件中使用func displayItems和@objc func updateExistingItem。 -
在函数前添加
@objc(如果可能)没有问题。它只是告诉使用桥接,Objective-C 代码可以调用它。作为“纯粹的 Objective-C 代码”,或者带有#selector的底层代码(这是“遗留”的东西,因为 Swift 基于以前的 Objective-C API 和一些机制)。 -
@Larme 我明白了!所以,我会在我的项目中保留
@objc的那个。非常感谢!!
标签: swift objective-c uiviewcontroller nsnotificationcenter observers