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,但还没有登陆.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...