【问题标题】:Set type of an array when initializing a class初始化类时设置数组的类型
【发布时间】:2014-08-04 16:42:38
【问题描述】:

我有一个名为 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 中强制转换对象的真实类型。有没有办法这样做?我必须使用惰性初始化、结构、泛型类型吗?

这是一个伪代码的尝试:

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>
        }
    }
}

【问题讨论】:

  • 为什么您的数组需要在运行时包含变体类型?这是你可以设计的东西吗?这似乎很混乱,如果我跳入代码库,我会被这个抛出。

标签: arrays class swift initialization


【解决方案1】:

正如 Oscar 和 Elijah 所指出的(对他们投赞成票),我只是想在这里更详细一点。您需要在定义类时声明泛型 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]

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

【讨论】:

    【解决方案2】:
    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!
    

    【讨论】:

      【解决方案3】:
      class Controller<T> {
          var array: Array<T> = []
      
          ...
      }
      

      【讨论】:

      • 您不能为此添加一个小对话框吗?
      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多