我在将我的框架与利用该框架的代码链接时遇到麻烦。具体来说,链接器无法找到泛型结构扩展的符号。
这是Optional的扩展之一:
extension Optional { /// Unwrap the value returning 'defaultValue' if the value is currently nil func or(defaultValue: T) -> T { switch(self) { case .None: return defaultValue case .Some(let value): return value } } }
如果代码是在应用程序的主要部分内编译的,则此方法在游乐场或应用程序中非常有用。但是,当我尝试将其编译到框架中时,应用程序(甚至框架的测试)会产生以下链接器错误:
架构i386的未定义符号:“ __ TFSq2orU__fGSqQ__FQQ”,引用自:Optional + SwiftPlusPlusTests.o中的__TFC18SwiftPlusPlusTests27Optional_SwiftPlusPlusTests13testOrWithNilfS0_FT_T_
类似于以下方法的类似方法,也可以很好地链接(注意,它不在通用名称上)
extension String { /// Returns a string by repeating it 'times' times func repeat(times: Int) -> String { var result = "" for i in 0..times { result += self } return result } }
我在github上的存储库中还有另外两个扩展:SwiftPlusPlus,它们也不会链接(都在通用strucs上)。如果拉出最新的提交,构建框架,然后尝试运行单元测试,则将重现这些错误。
到目前为止,我已经尝试在输出的框架和中间文件上运行“字符串”,并且看不到这些扩展的符号,但是我确实看到了repeaton 的方法扩展的符号String。因此,它似乎甚至没有将它们编译到库中。
repeat
String
有谁知道为什么在框架中没有定义符号?
编辑
我在Apple Developer论坛上发帖 ,一名Apple员工回答说这是一个已知的错误。
看起来,当编译器位于不同的框架中时,它们会弄错通用扩展中方法的错误符号名称。