如何使用nil初始化Swift数组

时间:2017-04-06 09:52:44

标签: swift

我正在尝试将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)
        ^~~~~~~~~

我想了解为什么会出现这种错误?

2 个答案:

答案 0 :(得分:2)

问题在于T: Comparable并不一定意味着Int,它表示符合Comparable的任何值,包括StringFloatBool ,以及其他程序员为自己的项目编写的成千上万的自定义结构。

由于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)