gpt4 book ai didi

objective-c - Swift #available 关键字与 respondsToSelector

转载 作者:可可西里 更新时间:2023-11-01 00:52:27 33 4
gpt4 key购买 nike

根据pre-release Swift 2 documentation现在有一个 #available 关键字可以与 if letguard 语句一起使用来检查 API 可用性。它给出了以下示例:

let locationManager = CLLocationManager()
if #available(iOS 8.0, OSX 10.10, *) {
locationManager.requestWhenInUseAuthorization()
}

或者

let locationManager = CLLocationManager()
guard #available(iOS 8.0, OSX 10.10, *) else { return }
locationManager.requestWhenInUseAuthorization()

它(文档)声明的内容等效于以下 Objective-C 代码:

if ([CLLocationManager instancesRespondToSelector:@selector(requestWhenInUseAuthorization)]) {
// Method is available for use.
} else {
// Method is not available.
}

显然 respondsToSelector: 仅适用于 NSObject 的子类,而 #available 关键字甚至适用于“纯”Swift 代码,所以我欣赏这种优势。

然而,自从开始 iOS 开发以来,我一直认为针对这种情况的最佳做法是检测 API 的存在,而不是依赖于引入的版本。

作为一个更具体的例子,我想到了 Apple 在 iOS 7 中的 NSArray 上引入了 firstObject,但又追溯回 iOS 4(在它可用的地方) ,但私有(private))。任何使用 respondsToSelector: 的代码都可以在 iOS < 7 上运行,但显然版本检查会失败。

转移到我错过的 #available 关键字有什么好处吗?

最佳答案

一个很大的优势是 Xcode 7 中的 Swift 2 编译器比较了类、方法、属性的可用性……针对部署您项目的目标。

使用 respondsToSelector 总是容易出错。对于 Objective-C,

if ([CLLocationManager instancesRespondToSelector:@selector(requestWhenInUseAuthorization)]) {

编译器只验证 requestWhenInUseAuthorization 是否是一些已知方法,但它无法验证该检查在逻辑上是否正确。

在 Swift 中,情况更糟,因为选择器只能指定为字符串,编译器不验证任何内容。

用Swift 2/Xcode 7,对应代码

let locationManager = CLLocationManager()
if locationManager.respondsToSelector("requestWhenInUseAuthorization") {
locationManager.requestWhenInUseAuthorization()
}

如果部署目标低于 iOS 8,则不再编译,错误信息是

error: 'requestWhenInUseAuthorization()' is only available on iOS 8.0 or newer            locationManager.requestWhenInUseAuthorization()                            ^note: add 'if #available' version check

With

let locationManager = CLLocationManager()
if #available(iOS 8.0, OSX 10.10, *) {
locationManager.requestWhenInUseAuthorization()
}

编译器知道该方法只会在 iOS 8 及更高版本上被调用并且不提示。

关于objective-c - Swift #available 关键字与 respondsToSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32518548/

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