swift - 如何消除同名类型和模块的歧义?

标签 swift swift3

我正在尝试使用 Károly Lőrentey 的 B-tree based OrderedSet 在一个项目中。但是,我遇到了无法声明不合格的问题 OrderedSet<T>因为基金会的 NSOrderedSet 之间的名称冲突(在 Swift 3 中作为 OrderedSet 导入)和 BTreeOrderedSet .

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 认为我指的是一个名为 OrderedSet 的类型嵌套在 BTree.BTree 中类型。

let set = BTree.OrderedSet<Int>()
// error: reference to generic type 'BTree' requires arguments in <...>

如果我不import 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 中的那个。

如果这在某些文件中仍然不明确或次优,您可以创建一个 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 的新语法,但未能通过。

关于swift - 如何消除同名类型和模块的歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892621/

相关文章:

ios - XC UITesting 因查找 UIElements 而闪烁

swift - 有没有一种简单的方法可以识别 Watch Kit 中文本的颜色 - Swift

ios - 无法更改 Swift iOS 自定义单元格属性(展开空可选)

swift - 向 UINavigationBar 添加按钮

objective-c - 在类型 'myArray' 的对象上找不到属性 'MyVC *' Swift 到 Obj-C 传递数组错误

swift - 如何覆盖函数的协议(protocol)扩展默认实现?

ios - 按钮状态信息

swift - 使用 pow() 函数生成 Decimal 时接收 NaN 作为输出

ios - 第一次点击按钮时不会播放 segue 的自定义动画

ios - 在 ARAnchor 方向之间制作动画