我已经升级到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)
所有内容都能编译并正常运行,但是在子项目上运行调试会话时,从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()
}
}
在Wizard的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不会发生此问题。
答案 0 :(得分:2)
以我的拙见,这只能是一个错误。
如果我设置您要回答的示例,则可以重现该问题。
在断点上,我得到
(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 知道类型为字符串。它知道,在扩展名中定义了一个函数castSpell
,并且知道该函数的确切一种实现。但它仍然显示错误消息。
因此,除非我在这里缺少必要的内容,否则这一定是lldb错误。
答案 1 :(得分:0)
我的扩展名存在相同的问题。在我的情况下,这是我在调试时经常使用的单个函数,因此我刚刚创建了一个全局函数,在您的情况下,它将仅接受字符串并在内部调用该扩展名。确实类似于@aepryus在第一个答案的评论中指出的内容。
?
然后像这样使用它:
function pruneParams(key, url) {
var urlParts = url.split('?');
var rtnUrl = urlParts[0];
var paramParts;
var paramValue;
var params_arr = [];
var queryString = decodeURIComponent(urlParts[1] || '');
if (queryString !== '') {
params_arr = queryString.split('&');
for (var i = params_arr.length - 1; i >= 0; --i) {
paramParts = params_arr[i].split('=');
if (paramParts[0] === key) {
paramValue = paramParts[1];
params_arr.splice(i, 1);
}
}
if (params_arr.length) {
var wasEncoded = url.split('&').length < 2;
rtnUrl = rtnUrl + '?' + (wasEncoded ? encodeURIComponent(params_arr.join('&')) : params_arr.join('&'));
}
}
return { url: rtnUrl, [key]: paramValue, paramCount: params_arr.length > 1 };
}
var u1 = 'http://localhost:4200/member/';
var u2 = 'http://localhost:4200/member/?ts=23423424';
var u3 = 'http://localhost:4200/member/?fooo=2342342asfasf&ts=252523525';
var u4 = 'http://localhost:4200/member?foo=234243&ts=234124124&bar=21kfafjasf&ts=223424234&dd=This Is A Line';
var u5 = 'http://localhost:4200/member?foo%3D234243%26ts%3D2242424%26bar%3D21kfafjasf%26dd%3DThis%20Is%20A%20Line';
console.log(pruneParams('ts', u1));
console.log(pruneParams('ts', u2));
console.log(pruneParams('ts', u3));
console.log(pruneParams('ts', u4));
console.log(pruneParams('ts', u5));
// {
// url: 'http://localhost:4200/member/',
// ts: undefined,
// paramCount: false,
// }
// {
// url: 'http://localhost:4200/member/',
// ts: '23423424',
// paramCount: false,
// }
// {
// url: 'http://localhost:4200/member/?fooo=2342342asfasf',
// ts: '252523525',
// paramCount: false,
// },
// {
// url: 'http://localhost:4200/member?foo=234243&bar=21kfafjasf&dd=This Is A Line',
// ts: '234124124',
// paramCount: true,
// }
// {
// url: 'http://localhost:4200/member?foo%3D234243%26bar%3D21kfafjasf%26dd%3DThis%20Is%20A%20Line',
// ts: '2242424',
// paramCount: true,
// }