当前位置: 首页 > 面试题库 >

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

倪炎彬
2023-03-14
问题内容

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

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

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

编辑

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

问题答案:

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

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



 类似资料:
  • 作者:陈希章 发表于 2018年4月7日 前言 此前我有一篇 文章 讲解了Microsoft Graph的一种数据扩展技术—— 开发扩展(Open Extensions),它可以实现在支持的对象(例如用户,组等)上面附加任意的数据。但开放扩展的问题在于,它是基于某个具体对象的,你无法确定两个对象是否具有同样的扩展(即便属性名一样,但也可能其包含的数据完全不同)。如果我们需要对一类对象进行统一的扩展

  • 我是EF core的新手,我正在尝试让它与我的ASP一起工作。NET核心项目。 当尝试配置以使用配置中的连接字符串时,我在我的中得到上述错误。我正在遵循本教程。 问题代码在启动中。cs: 如果我将方法直接放入上下文中,则可以识别它: 我在网上的所有研究都指向缺失的参考文献,但我似乎无法找出我缺失的是哪一个(见图)。

  • 问题内容: 如果我有一个通用的结构像… 然后我可以扩展为仅当is 时才符合。喜欢… 这可能吗? 我尝试了几种不同的编码方式,但是每种方式都给我一个略有不同的错误。 问题答案: 更新: 条件一致性已在Swift 4.1中实现,您的代码 可以按照Xcode 9.3的要求进行编译和工作。 您正在寻找的是 SE-0143条件符合 (这又是“泛型宣言”的一部分)。该提案已被Swift 4接受,但尚未实施。从

  • 第十三章介绍了如何开发一个Web框架,通过介绍MVC、路由、日志处理、配置处理完成了一个基本的框架系统,但是一个好的框架需要一些方便的辅助工具来快速的开发Web,那么我们这一章将就如何提供一些快速开发Web的工具进行介绍,第一小节介绍如何处理静态文件,如何利用现有的twitter开源的bootstrap进行快速的开发美观的站点,第二小节介绍如何利用前面介绍的session来进行用户登录处理,第三小

  • 问题内容: 我正在尝试编写一个简单的Array扩展,该扩展提供了“ distinct”方法。这是我到目前为止的内容: 问题是“包含”语句失败,如下所示: 找不到包含所提供参数的“包含”的重载 我很确定类型约束是正确的。有任何想法吗? 问题答案: 斯威夫特1.x 元素中的元素不必是,即它们不必与。 这意味着您不能为 所有 可能的数组编写该函数。而且Swift不允许您仅扩展Arrays的子集。 这意味

  • 问题内容: 目前,我有两个几乎相同的架构: 和 它们的唯一区别在于验证:用户不需要名字,姓氏或电话。但是,管理员必须定义这些属性。 不幸的是,上面的代码不是很干,因为它们几乎相同。因此,我想知道是否有可能基于。例如: 显然,这只是伪代码。这样的事情可能吗? 另一个非常相似的问题是,是否有可能基于另一个创建新的架构,并为其添加更多属性。例如: 问题答案: 在其他地方,有人建议使用utils.inhe