gpt4 book ai didi

ios - 子类中的 Swift #selector

转载 作者:行者123 更新时间:2023-11-28 08:39:37 25 4
gpt4 key购买 nike

在我更新 XCode 之后,它现在可以为 iOS 9.3 构建代码,我有很多关于更新语法以符合即将到来的 Swift 的警告版本 3

很多警告都是关于Selector的,现在我正在使用这样的东西:

class Foo {

func registerPan() {
let recognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePan:"))
//do something with recognizer
}

func handlePan(recognizer:UIPanGestureRecognizer) {
//handle pan gesture
}
}

class Bar: Foo {

override func handlePan(recognizer:UIPanGestureRecognizer) {
//overriding handle pan gesture
}
}

因此 FooBar 的实例有自己的方式来处理平移手势。 Xcode 建议我更改使用选择器的方法,使用 #selector expression。编辑器自动建议的更改是:

#selector(Foo.handlePan(_:))

我的问题来了。在之前的版本中,分别为基类和子类调用了具体的实现。现在,看起来即使是 Bar 类的实例也会调用 Foo 的函数(Bar 继承 registerPan来自 Foo 的函数)。这是正确的吗?

可能 XCode 静态分析在这里不关心继承。我正在考虑将这些选择器更改为:

#selector(self.handlePan(_:))

所以任何类的实例调用它自己的实现,但我想确定这是否是个好主意。

最佳答案

正如 Apple 文档所说:

A selector expression lets you access the selector used to refer to a method in Objective-C.

#selector(method name)

The method name must be a reference to a method that is available in the Objective-C runtime. The value of a selector expression is an instance of the Selector type. For example:

class SomeClass: NSObject {
@objc(doSomethingWithInt:)
func doSomething(x: Int) { }
}
let x = SomeClass()
let selector = #selector(x.doSomething(_:))

..Because the selector is created at compile time, not at runtime, the compiler can check that the method exists and that the method is exposed to the Objective-C runtime.

您还可以在您的 vc('s) 中扩展 Selector 并在那里声明您的选择器:

private extension Selector {
static let updateItems = #selector(CharactersListVC.updateItems)
static let getMoreItems = #selector(CharactersListVC.getMoreItems)
}

然后就这样使用它:

button?.addTarget(self, action: .updateItems, forControlEvents: .TouchUpInside)

希望对您有所帮助:)

关于ios - 子类中的 Swift #selector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36730672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com