初始化类时设置数组的类型

时间:2014-08-04 16:42:38

标签: arrays class swift initialization

我有一个名为Controller的类,它包含一个Array属性。现在,我的班级被宣布为:

class Controller {
    var myArray: [AnyObject] 

    init(bool: Bool) {
        if bool == true {
            myArray = [10, 11, 12]
        } else {
            myArray = ["Yo", "Ya", "Yi"]
        }
    }
}

我对这段代码的问题是myArray在我的类初始化之后仍然(当然)类型为[AnyObject]。因此,每次我需要从myArray中获取一个对象时,我必须像这样强制转换它的类型(Int或String):

let controller = Controller(bool: false)
let str = controller.array[0] as String

我希望能够编写let str = controller.array[0] //str: String而无需在myArray中强制转换对象的真实类型。有办法吗?我是否必须使用lazy init,struct,泛型类型?

这是伪代码的尝试:

class Controller {
    var myArray: Array<T> //Error: use of undeclared type 'T'

    init(bool: Bool) {
        if bool == true {
            myArray = [10, 11, 12] as [Int] //myArray: Array<Int>
        } else {
            myArray = ["Yo", "Ya", "Yi"] as [String] //myArray: Array<String>
        }
    }
}

3 个答案:

答案 0 :(得分:3)

class Controller<T> //You missed that T, right?
{ 
    var myArray: Array<T>
    /* initialization stuff */
}

var c = Controller<String>()
c.myArray[0] = "Hey!"
let str = c.myArray[0] //String, eventually!

答案 1 :(得分:3)

正如奥斯卡和以利亚指出的那样(向他们投票),我只是想在这里变得更加冗长。在定义类时,需要声明泛型T

这意味着您需要在初始化类时定义泛型的类型。

class Foo<T> {
    var items = [T]()
}

let stringFoo = Foo<String>()

stringFoo.items.append("bar")
stringFoo.items[0] = "barbar"

stringFoo.items                 // ["barbar"]



let intFoo = Foo<Int>()

intFoo.items.append(1)
intFoo.items[0] = 11

intFoo.items                    // [11]

因此,在您的情况下,不要为Bool方法传递init,而是在初始化时定义泛型类型。

答案 2 :(得分:2)

class Controller<T> {
    var array: Array<T> = []

    ...
}