一尘不染

Swift框架不包含从扩展到通用结构的符号

swift

我在将我的框架与利用该框架的代码链接时遇到麻烦。具体来说,链接器无法找到泛型结构扩展的符号。

这是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。因此,它似乎甚至没有将它们编译到库中。

有谁知道为什么在框架中没有定义符号?

编辑

  • 是我的可选扩展程序的链接
  • 是指向测试文件的链接,在尝试编译测试目标时会导致链接器错误

阅读 205

收藏
2020-07-07

共1个答案

一尘不染

在Apple Developer论坛上发帖
,一名Apple员工回答说这是一个已知的错误。

看起来,当编译器位于不同的框架中时,它们会弄错通用扩展中方法的错误符号名称。

2020-07-07