Swift框架不包括通用结构扩展的符号

我无法链接我的框架与利用该框架的代码。 具体而言,链接程序无法findgenerics结构的扩展符号。

这是可选的扩展之一:

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 } } } 

如果在应用程序的主要部分编译代码,此方法在游乐场或应用程序中效果很好。 但是,当我尝试将其编译为框架时,应用程序(甚至框架的testing)产生以下链接器错误:

架构i386的未定义符号:“__TFSq2orU__fGSqQ__FQQ”,引用来自:__TFC18SwiftPlusPlusTests27Optional_SwiftPlusPlusTests13testOrWithNilfS0_FT_T_可选+ SwiftPlusPlusTests.o

类似的方法,如下面的,链接罚款(注意,它不是一个通用的)

 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也不链接(在generics结构上)。 如果您拉取最新的提交,构build框架,然后尝试运行unit testing,则会重现错误。

到目前为止,我已经试图在输出的框架和中间文件上运行“string”,并且我没有看到这些扩展的符号,但是我在String上看到了repeat方法扩展的符号。 所以它甚至不会把它们编译进库中。

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

编辑

  • 这是我的可选扩展的链接
  • 这里是链接到testing文件,当试图编译testing目标时导致链接器错误

我发布在苹果开发者论坛上 ,一名苹果员工回应说,这是一个已知的错误。

它看起来像编译器得到的错误,当他们住在一个不同的框架中的generics扩展方法错误的符号名称。

如果你正在寻找一个临时修复,你可以将扩展包装在一个类的方法中:

 // In your framework public class OptionalOperator { public class func or<T>(optional:Optional<T>,defaultValue:T) ->T { return optional.or(defaultValue) } } // Outside the framework var maybeText:String? let text = OptionalOperator.or(maybeText, defaultValue: "Apple, please fix this") 

当然,这不是理想的,并且破坏了扩展的目的。 所以如果你打算经常调用这个方法,我们可以重载/定义一个操作符 。

 // In your framework infix operator 

{} public func

<T>(left:Optional<T>, right:T) -> T { return left.or(right) } // Outside the framework var maybeText:String? let text = maybeText

"Apple, please fix this"

在我的情况下,我有多个应用程序使用框架,所以我想保持在框架内的方法实现。 然而,重载一个操作符(或者只是使用一个全局函数)会很笨拙,所以我必须先去第一个选项,直到修正了这个错误。

希望这可以帮助。

UPDATE

有趣的是,Swift已经有一个运算符( ? )。

 var maybeText:String? let text = maybeText ?? "Nice!" 

它被称为 – 无合并操作符