Swift App - 从AnyObject转换为NSArray似乎失败了

时间:2014-09-02 22:58:59

标签: ios xcode swift

我在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强制执行以前没有强制执行的东西。我已经尝试过各种我能想到的明确演员,但没有成功。

任何帮助都将非常感激。

2 个答案:

答案 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"