ios – 如何使用Swift 3选择器?

前端之家收集整理的这篇文章主要介绍了ios – 如何使用Swift 3选择器?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
到目前为止,我已经有了这个代码
if UIScreen.instancesRespondToSelector(Selector("scale")) {
  UIGraphicsBeginImageContextWithOptions(size,false,UIScreen.mainScreen().scale);
}else{...}

我没有写这段代码,所以我不确定它是什么,但看起来他们想要验证UIScreen.mainScreen()实际上可以有变量.scale(?).

在查看.scale时,它看起来像iOS 4.0以来一直可用.由于我们支持iOS 7,这不是必需的,对吧?

无论如何,这不是当前的问题.
由于Xcode 7.3向Swift 3发出了这些新的选择器实例或诸如此类的东西,我现在有数百个警告.

Xcode要我改变这个:

选择(“规模”)

#selector(NSDecimalNumberBehaviors.scale)

到目前为止,我改变的所有其他选择器都是合乎逻辑的,比如“将Selector(”hello“)更改为#selector(MyClass.hello),但是这个NSDecimal ……听起来有点激烈.我能相信Xcode选择正确的选择器吗?我无法在任何连接到UIScreen.scale的地方找到NSDecimalNumberBehaviors ..如果我输入#selector(UIScreen.scale)我收到错误..

我唯一知道的是,如果我在这里点击CMD:NSDecimalNumberBehaviors.scale和这里:UIScreen.mainScreen().scale我最终在不同的地方..

解决方法

正如评论中所指出的,这段代码是一个残留的尝试,以支持旧的iOS版本,这些版本不仅不再相关,而且在Swift开发时甚至无法成为目标.

只需直接调用UIGraphicsBeginImageContextWithOptions(size,UIScreen.mainScreen().scale) – 您可以使用Swift定位的所有iOS版本上都存在scale属性,因此无需检查它.

实际上,通常使用选择器检查来测试API可用性并不是一个好主意.选择器可能存在于您要定位的版本之下,但是具有不同行为的私有API – 因此您的检查会成功,但您的代码将无法正常运行.这就是为什么@available and #available system在Swift 2中引入的原因.

(基于版本的可用性检查的另一个好处是:当操作系统版本变得足够老以便您放弃支持时,可以更容易地找到代码中可以清理的所有站点.您不必记住哪个版本方法/属性变得普遍.)

如果由于某些其他原因你需要为UIScreen.scale形成一个Selector …你不能在Swift 2.2中使用#selector表达式,因为scale是属性,而不是方法.在Swift 2.2中,#selector接受一个函数/引用,并且无法获得对属性的底层getter或setter方法的引用.您仍然需要从字符串构造该选择器.要绕过警告,请将字符串文字存储在临时文件中:

let scale = "scale"
let selector = Selector(scale)

或者做一些其他舞蹈传递一个字符串,但不直接将字符串文字传递给Selector初始值设定项:

let selector = Selector({"scale"}())

在Swift 3中将会有a special form of #selector for property getters/setters,但还没有登陆.

猜你在找的iOS相关文章