Bil*_*ill 16 linker objective-c dynamic-linking ios swift
在Objective-C中,如果我想使用仅出现在新版iOS中的特定类,我会这样做:
if( [UIBlurEffect class] ) {
// do something with UIBlurEffect
}
else {
// gracefully fallback to old behavior
}
Run Code Online (Sandbox Code Playgroud)
但是,等效的Swift:
if UIBlurEffect.self != nil {
let blur: UIBlurEffect = UIBlurEffect(...)
// ...
else {
// ...
}
// also occurs with NSClassFromString("UIBlurEffect")
Run Code Online (Sandbox Code Playgroud)
没有相同的功能.
如果在NSNewFeature可用的环境中运行,一切都很好.但是如果未定义类,则在启动应用程序时会出现链接错误:
dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect
Run Code Online (Sandbox Code Playgroud)
那么如何在Swift中进行弱链接?
编辑添加UIBlurEffect为特定示例.
好像我已经知道你能做什么了
我曾经NSClassFromString()检查过设备上是否有类,即
if NSClassFromString("UIBlurEffect") {
let blur = UIBlurEffect(...)
//...
}
else {
//...
}
Run Code Online (Sandbox Code Playgroud)需要使UIKit.framework(或另一个相应的框架)可选.如果您在XCode6-BetaX中创建基于Swift的应用程序,则所有框架都不会显式添加到链接构建阶段,因此您需要转到目标设置,添加UIKit.framework为链接框架(在"Link Binary With Libraries"部分中) )并将其状态更改为Optional.这一步可以解决问题,我已经设法运行特定于版本的代码而没有任何问题.
更新:因为Xcode 6 beta 6(来自@ user102008),您不再需要将其设为可选项
更新2:您实际上无法对nil执行隐式if语句检查(自Xcode 6 Beta 5起).你需要断言它:
if NSClassFromString("UIBlurEffect") != nil {
let blur = UIBlurEffect(...)
//...
}
else {
//...
}
Run Code Online (Sandbox Code Playgroud)
(来自@ daniel-galasko)
| 归档时间: |
|
| 查看次数: |
2856 次 |
| 最近记录: |