gpt4 book ai didi

Swift框架在lldb中返回 'ambiguous use of'方法扩展

转载 作者:行者123 更新时间:2023-12-04 20:26:50 38 4
gpt4 key购买 nike

我已经升级到Xcode 11和Swift 5,并且在通过框架提供方法扩展时遇到了一个问题。更具体地说,在一个结构如下的项目中:

-> Main Project
-> Framework created from sources in 'Main Project'
-> Subproject using the above Framework (Sources packaged in the framework are not visible to the sub-project)

一切都能编译并运行良好,但是在子项目上运行调试 session 时,从lldb命令行调用时,“框架”中的所有扩展都返回 error: ambiguous use of。这是一个给出想法的代码示例:

创建一个macOs命令行项目,并在文件Spells.swift中添加一个新目标“MagicFramework”(确保该文件对Main&MagicFramework可见)
import Foundation

extension String {
public func castSpell() -> String {
return "✨ " + self
}
}

然后在文件wizard.swift(仅对Wizard可见)中创建一个子项目“Wizard”:
import Foundation
import MagicFramework


public class Tadaa {

public func magic(spell:String) -> String {
return spell.castSpell()
}
}

在向导的main.swift文件中,添加:
import Foundation

let aa = Tadaa().magic(spell: "this is magic")

print(aa)

您应该具有以下结构:
-> Main project
----> MagicFramework
----> Wizard subproject

然后构建并运行“Wizard”子程序,并在 spell.castSpell()中的 Tadaa上带有一个断点。在lldb提示符下,键入:
(lldb)po spell.castSpell()
error: <EXPR>:3:1: error: ambiguous use of 'castSpell()'
spell.castSpell()

为什么?? Xcode 10不会发生此问题。

最佳答案

以我的拙见,这只能是一个错误。

如果我设置了您要提出的问题的示例,则可以重现该问题。

在断点上,我得到

(lldb) po spell.castSpell()
error: <EXPR>:3:1: error: ambiguous use of 'castSpell()'
spell.castSpell()
^

正如您所描述的。

但是,如果我在lldb中查找函数 castSpell,则会得到:
(lldb) image lookup -vn castSpell
1 match found in /Users/lameyl01/Library/Developer/Xcode/DerivedData/Main-dsjbnoyousgzmrdnqxtxoeyeyzpv/Build/Products/Debug/MagicFramework.framework/Versions/A/MagicFramework:
Address: MagicFramework[0x0000000000000ab0] (MagicFramework.__TEXT.__text + 0)
Summary: MagicFramework`(extension in MagicFramework):Swift.String.castSpell() -> Swift.String at Spells.swift:12
Module: file = "/Users/lameyl01/Library/Developer/Xcode/DerivedData/Main-dsjbnoyousgzmrdnqxtxoeyeyzpv/Build/Products/Debug/MagicFramework.framework/Versions/A/MagicFramework", arch = "x86_64"
CompileUnit: id = {0x00000000}, file = "/Users/lameyl01/tmp/Main/MagicFramework/Spells.swift", language = "swift"
Function: id = {0x100000038}, name = "(extension in MagicFramework):Swift.String.castSpell() -> Swift.String", mangled = "$sSS14MagicFrameworkE9castSpellSSyF", range = [0x000000010033fab0-0x000000010033fb21)
FuncType: id = {0x100000038}, byte-size = 8, decl = Spells.swift:12, compiler_type = "() -> ()"
Blocks: id = {0x100000038}, range = [0x10033fab0-0x10033fb21)
LineEntry: [0x000000010033fab0-0x000000010033fabf): /Users/lameyl01/tmp/Main/MagicFramework/Spells.swift:12
Symbol: id = {0x00000005}, range = [0x000000010033fab0-0x000000010033fb21), name="(extension in MagicFramework):Swift.String.castSpell() -> Swift.String", mangled="$sSS14MagicFrameworkE9castSpellSSyF"
Variable: id = {0x100000055}, name = "self", type = "Swift.String", location = DW_OP_fbreg(-16), decl = Spells.swift:12

因此,这意味着lldb恰好找到了一个匹配项: MagicFramework库中的扩展名。因此,没有理由为什么这应该是模棱两可的。

为了完整起见,我还检查了llbd看到的 spell变量的类型:
(lldb) frame variable spell
(String) spell = "this is magic"

所以总结一下:
lldb知道类型为String。它知道在扩展名中定义了一个函数 castSpell,并且知道该函数的确切一种实现。但是它仍然显示错误消息。

因此,除非我在这里缺少必要的内容,否则这一定是lldb错误。

关于Swift框架在lldb中返回 'ambiguous use of'方法扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58705591/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com