Ale*_*lex 9 frameworks lldb swift
我已升级到 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)
Run Code Online (Sandbox Code Playgroud)
一切都编译并运行良好,但是在子项目上运行调试会话error: ambiguous use of时,从 lldb 命令行调用时,“框架”中的所有扩展都会返回。这是一个给出想法的代码示例:
创建一个 macOs 命令行项目,并在文件 Spells.swift 中添加一个新目标“MagicFramework”(确保该文件对 Main & MagicFramework 可见)
import Foundation
extension String {
public func castSpell() -> String {
return "? " + self
}
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个子项目'Wizard',并在一个文件wizard.swift(仅对Wizard 可见):
import Foundation
import MagicFramework
public class Tadaa {
public func magic(spell:String) -> String {
return spell.castSpell()
}
}
Run Code Online (Sandbox Code Playgroud)
在向导的 main.swift 文件中,添加:
import Foundation
let aa = Tadaa().magic(spell: "this is magic")
print(aa)
Run Code Online (Sandbox Code Playgroud)
您应该具有以下结构:
-> Main project
----> MagicFramework
----> Wizard subproject
Run Code Online (Sandbox Code Playgroud)
然后构建并运行 'Wizard' sub,在spell.castSpell()in上有一个断点Tadaa。在 lldb 提示符下,键入:
(lldb)po spell.castSpell()
error: <EXPR>:3:1: error: ambiguous use of 'castSpell()'
spell.castSpell()
Run Code Online (Sandbox Code Playgroud)
为什么??Xcode 10 没有出现这个问题。
在我看来,这只能是一个错误。
如果我设置了您在问题中给出的示例,我可以重现该问题。
在断点上,我得到
(lldb) po spell.castSpell()
error: <EXPR>:3:1: error: ambiguous use of 'castSpell()'
spell.castSpell()
^
Run Code Online (Sandbox Code Playgroud)
就像你描述的那样。
但是,如果我castSpell在 lldb 中查找该函数,则会得到:
(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
Run Code Online (Sandbox Code Playgroud)
所以这意味着 lldb 找到了一个匹配项:MagicFramework库中的扩展名。所以没有理由为什么这应该是模棱两可的。
为了完整起见,我还检查了spellllbd 看到的变量类型:
(lldb) frame variable spell
(String) spell = "this is magic"
Run Code Online (Sandbox Code Playgroud)
所以总结一下:lldb知道类型是字符串。它知道castSpell在扩展中定义了一个函数,并且它知道该函数的一个实现。但它仍然显示错误消息。
所以除非我在这里遗漏了一些重要的东西,否则这一定是一个 lldb 错误。