swift – 如何消除具有相同名称的类型和模块的歧义?
发布时间:2020-12-14 05:49:58 所属栏目:百科 来源:网络整理
导读:我正在尝试在一个项目中使用KárolyL?rentey的 B-tree based OrderedSet 。但是,我遇到了一个问题,我无法声明一个不合格的OrderedSet T因为名称在Foundation的NSOrderedSet(在Swift 3中作为OrderedSet导入)和BTree的OrderedSet之间发生冲突。 let set = Or
我正在尝试在一个项目中使用KárolyL?rentey的
B-tree based
OrderedSet 。但是,我遇到了一个问题,我无法声明一个不合格的OrderedSet< T>因为名称在Foundation的NSOrderedSet(在Swift 3中作为OrderedSet导入)和BTree的OrderedSet之间发生冲突。
let set = OrderedSet<Int>() // error: 'OrderedSet' is ambiguous for type lookup in this context // Found this candidate: Foundation.OrderedSet:3:14 // Found this candidate: BTree.OrderedSet:12:15 要解决此冲突,您通常会限定名称,这将为您提供BTree.OrderedSet< T>。但是,BTree模块还包含一个名为BTree的类。如果我写BTree.OrderedSet,Swift认为我指的是嵌套在BTree.BTree类型中的名为OrderedSet的类型。 let set = BTree.OrderedSet<Int>() // error: reference to generic type 'BTree' requires arguments in <...> 如果我不导入BTree,我根本不能使用BTree名称。 // no import BTree let set = BTree.OrderedSet<Int>() // error: use of undeclared type 'BTree' 如何解决BTree类型和BTree模块之间的这种歧义?
可以使用鲜为人知的import(class | struct | func | protocol | enum)Module.Symbol语法消除类型的歧义。
import struct BTree.OrderedSet 从这一点开始,OrderedSet明确地引用了BTree中的那个。 如果在某些文件中这仍然是不明确的或次优的,您可以使用typealiases创建一个Swift文件来重命名导入: // a.swift import struct BTree.OrderedSet typealias BTreeOrderedSet<T> = BTree.OrderedSet<T> // b.swift let foo = OrderedSet<Int>() // from Foundation let bar = BTreeOrderedSet<Int>() // from BTree 为Swift 3讨论了一种新的语法,但它失败了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |