• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:03:37 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试使用 Károly Lőrentey 的 B-tree based OrderedSet在一个项目中。但是,我遇到了一个问题,我无法声明不合格的 OrderedSet 因为 Foundation 的 NSOrderedSet 之间的名称冲突(导入为 OrderedSet in Swift 3) 和 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。但是,BTree 模块还包含一个名为BTree 的类。如果我编写 BTree.OrderedSet,Swift 认为我指的是嵌套在 BTree.BTree 类型中的名为 OrderedSet 的类型。

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 模块之间的这种歧义?



Best Answer-推荐答案


可以使用鲜为人知的 import (class|struct|func|protocol|enum) Module.Symbol 语法来消除类型的歧义。

import struct BTree.OrderedSet

从现在开始,OrderedSet 明确地指向 BTree 中的那个。

如果这在某些文件中仍然模棱两可或次优,您可以创建一个 Swift 文件以使用 typealiases 重命名导入:

// 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/49909171/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap