Swift应用程序 - 从AnyObject转换为NSArray似乎失败

3

我在苹果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)

从链接错误和我试图调试的情况来看,似乎将类型为 AnyObject 的[0]转换为所需的 NSArray 失败了。 我正在使用此示例,但在应用程序的其他区域中也遇到了类似的问题,所有这些区域都需要将 AnyObject 强制转换为 NSArray 或 NSDictionary 。

上面的原始代码在Xcode beta 5中运行得很好,但在后续beta版本中却没有。 显然,我不理解AnyObject到NSArray cast的某些内容,但我确实不知道是什么,并且似乎beta 5和6实施了以前未实施的内容。 我尝试了各种明确的强制转换,但没有成功。

非常感谢您的帮助。


我遇到了相同的问题,并尝试了beta 6中提出的所有解决方案:https://dev59.com/M18e5IYBdhLWcg3wyM0r#25376271,但都没有成功。希望有人能够对这个问题有所启示! - Kyle Rosenbluth
你可能需要提供更多的上下文来获得解决此问题的帮助。我尝试使用具有该签名的简单测试类复制该问题,使用Xcode 6 beta 7编译时没有遇到任何困难。 - user887210
我已经删除了派生数据并清理了构建和中间文件夹,这样做的次数已经数不清了,但是没有成功。我不知道我还能提供什么额外的上下文。我还编写了一个包含以上语句的测试类,结果也是相同的链接器错误。感谢您的回复 - 这告诉我有人正在使其工作! - johnz
1个回答

1

我改变了构建位置,现在代码可以编译、链接和运行。以前的构建位置是Custom/relative to workspace;我将其改为Unique。

我不知道为什么这会改变事情,因为我已经多次删除派生数据并清理了构建文件夹。但是……它起作用了,所以如果有人遇到相同的问题,请尝试一下。


有趣。我猜想它与二进制文件有关。你尝试过在进行干净构建时按住Option键吗? 快捷键是Option-Shift-Command-k,如果按住Option键,则菜单项是Product->Clean Build Folder... - user887210
我从来没有通过菜单完成这个操作 - 清除构建文件夹菜单项总是灰色的。我手动删除了我能找到的所有内容,但可能有些东西我错过了。无论如何,感谢您的关注和帮助。 - johnz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接