我正在尝试将nil
用于第0个索引元素,而rest将具有通用类型T
的值Comparable
。
因此,当我初始化它时nil
它将按预期工作
struct Container<T: Comparable> {
var container = [T?]()
init() {
container.append(nil)
}
}
但当我用一个整数说0时,我得到ambiguous reference
struct Container<T: Comparable> {
var container = [T?]()
init() {
container.append(0)
}
}
Playground execution failed: error: Algorithms.playground:7:9: error: ambiguous reference to member 'append'
container.append(0)
^~~~~~~~~
我想了解为什么会出现这种错误?
答案 0 :(得分:2)
问题在于T: Comparable
并不一定意味着Int,它表示符合Comparable
的任何值,包括String
,Float
,Bool
,以及其他程序员为自己的项目编写的成千上万的自定义结构。
由于0不是所有这些Structs的有效值,因此您基本上有两个问题之一:
1)我真的只想让Container始终使用Int
- 在这种情况下:
struct Container
{
var container: [Int?]
init()
{
container = [nil]
}
}
var a = Container()
a.container.append (0)
2)为什么我使用0,我的意思是nil
struct Container<T: Comparable>
{
var container: [T?]
init()
{
container = [nil]
}
}
var a = Container<Int>()
a.container.append (0)
答案 1 :(得分:1)
T
可以任何类似的类型(String
,自定义类型,...),
并且通常不会从0
初始化它
可能的。
您可以要求可以从整数文字创建T
,
这涵盖了所有整数和浮点类型:
struct Container<T: Comparable> where T: ExpressibleByIntegerLiteral {
var container = [T?]()
init() {
container.append(0)
}
}
或提供单独的append()
方法:
struct Container<T: Comparable> {
var container = [T?]()
init() {
container.append(nil)
}
mutating func append(_ newElement: T) {
container.append(newElement)
}
}
var c = Container<Int>()
c.append(0)