我在Apple IOS开发者上发布了这个问题'论坛,显着缺乏回应。我希望StackOverflow向导可以提供帮助......
我正在使用Swift开发iOS 8应用。在Xcode beta 5中,代码下面的代码工作正常,但在beta 6和beta 7中给出了链接器错误:
var sqlStr = "SELECT count(*) as count FROM nouns WHERE bucket = ?;"
var rs = db.executeQuery(sqlStr, withArgumentsInArray: [0] as NSArray)
链接器错误是:
Undefined symbols for architecture x86_64:
__TFSs26_forceBridgeFromObjectiveCU__FTPSs9AnyObject_MQ__Q_", referenced from:
__TFC8les_Mots13WordGenerator9getBucketfS0_FT_Si in WordGenerator.o
(getBucket是UIViewController WordGenerator中的一个方法。如果我将方法简化为这两行,我会得到相同的错误,如果我将这两行注释掉,那么错误就会消失,所以我知道问题是此处。)
db.executeQuery()是一个带有此签名的FMDB方法:
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;
如果我将代码更改为此代码,则适用于所有测试版:
var sqlStr = "SELECT count(*) as count FROM nouns WHERE bucket = '\(whereClause)';"
var rs = db.executeQuery(sqlStr, withArgumentsInArray: nil)
从链接器错误和我的试验和努力来调试它,看起来[0]的类型 AnyObject 转换为 NSArray ,这是必需的,是失败的。我正在使用此示例,但我在应用的其他方面看到了类似的问题,其中 AnyObject 必须强制转换为 NSArray 或 NSDictionary 。
上面的原始代码在Xcode beta 5中运行得很好,但在随后的beta版中没有。很明显,我并没有理解任何关于AnyA对NSArray演员的看法,但是如果我知道什么的话我就会知道,并且看来测试版5和6强制执行以前没有强制执行的东西。我已经尝试过各种我能想到的明确演员,但没有成功。
任何帮助都将非常感激。
答案 0 :(得分:1)
我更改了Build位置,现在代码编译,链接和运行。以前,构建位置是自定义/相对于工作区;我把它改成了Unique。
我不知道为什么会改变这些东西,因为我删除了派生数据并多次清理了构建文件夹。但是......它有效,所以如果有人遇到同样的问题,试一试。
答案 1 :(得分:-1)
我想你可能遇到了与此处发布的相同的问题:
https://stackoverflow.com/a/25376271/887210
基本上你需要按照该链接的步骤进行干净的构建。
我在Xcode 6 Beta 6中尝试使用以下代码的游乐场,它似乎正常工作:
import Foundation
let a:AnyObject = [0] as NSArray
if a is NSArray {
print("yep")
}
else {
print("nope")
}
结果:
[0]
"yep"