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我最终在不同的地方..
解决方法
只需直接调用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,但还没有登陆.