检查Swift中是否有可用的功能?

Jor*_*n H 10 ios uiaccessibility swift

我想检测用户是否已启用Reduce Transparency.你只需要调用func就可以了UIAccessibilityIsReduceMotionEnabled(),它会返回一个Bool.但我的应用程序针对的是iOS 7和8,并且此功能在iOS 7上不可用.

在Objective-C中,这是我检查该函数是否存在的方式:

if (UIAccessibilityIsReduceMotionEnabled != NULL) { }
Run Code Online (Sandbox Code Playgroud)

在Swift中,我无法弄清楚如何检查它是否存在.根据这个答案,您可以简单地使用可选链接,如果它nil不存在,但显然仅限于Obj-C协议.Xcode 6.1不喜欢这样:

let reduceMotionDetectionIsAvailable = UIAccessibilityIsReduceMotionEnabled?()
Run Code Online (Sandbox Code Playgroud)

它要你删除?当然,如果你这样做,它将在iOS 7上崩溃,因为该功能不存在.

检查这些类型的函数是否存在的正确方法是什么?

Jor*_*n H 9

Swift 2中添加了适当的可用性检查.建议使用此处提到的其他选项.

var shouldApplyMotionEffects = true
if #available(iOS 8.0, *) {
    shouldApplyMotionEffects = !UIAccessibilityIsReduceMotionEnabled()
}
Run Code Online (Sandbox Code Playgroud)


aet*_*the 6

如果你有点厚颜无耻,你可以随时使用库加载器打开UIKit二进制文件,看看它是否可以解析符号:

let uikitbundle = NSBundle(forClass: UIView.self)
let uikit = dlopen(uikitbundle.executablePath!, RTLD_LAZY)
let handle = dlsym(uikit, "UIAccessibilityIsReduceMotionEnabled")
if handle == nil {
    println("Not available!")
} else {
    println("Available!")
}
Run Code Online (Sandbox Code Playgroud)

dlopendlsym电话可以是有点贵,但这样我会建议保持dlopen手柄打开应用程序的寿命和存储某处的努力的结果dlsym.如果你不这样做,请确保你dlclose.

据我所知,这是AppStore的安全,因为它UIAccessibilityIsReduceMotionEnabled是一个公共API.