如何在Swift中初始化UIButtons的二维数组?

时间:2016-01-31 04:27:32

标签: ios swift multidimensional-array uibutton

我正在尝试将UIButtons的一维数组转换为它们的二维数组。为了做到这一点,我需要用nil值实例化一个空的二维UIButtons数组,然后我可以指向一维UIButton数组中的相应UIButton。因为我是Swift的新手,所以我对Optionals感到困惑。这是我的一维数组:

@IBOutlet var noteUIButtonArray: [UIButton]?

我想将这个128大小的一维数组转换成具有will值的U-DUTuttons的二维[8] [16]数组。我该怎么做?提前致谢。

1 个答案:

答案 0 :(得分:2)

如果数组值可以是nil,那么它所持有的类型必须是可选类型。您需要一个UIButton?的二维数组,它只是一个UIButton?[[UIButton?]]数组的数组。

Arrays有一个方便的初始化程序,它接受项目的数量和你想要初始化的值并创建数组。在您的情况下,使用二维数组,您将需要使用此初始化程序两次:对于数组的每一行一次,对每一列使用一次。

内部初始值设定项将创建一个16 nil值数组:

let row:[UIButton?] = Array(count: 16, repeatedValue: nil)

外部初始值设定项将创建一个8行数组:

var buttons2D:[[UIButton?]] = Array(count: 8, repeatedValue: row)

您通常将这两者嵌套在一起以初始化二维数组,如下所示:

var buttons2D:[[UIButton?]] = Array(count: 8, repeatedValue: Array(count: 16, repeatedValue: nil))

请注意,原始数组是UIButton[UIButton]?可选数组。这意味着该数组可能根本不存在(可以是nil),或者如果它确实存在,则它包含UIButton类型的项。此数组无法保存nil值。访问此数组中的值时,必须打开数组值。一种安全的方法是使用可选链接

例如,要访问noteUIButtonArray中的第一个按钮,您需要写:

let button = noteUIButtonArray?[0]

? 解包 可选数组,并允许您访问项0。如果noteUIButtonArraynil,那么可选链将为nil,因此button将收到值nil。由于button可以收到nil,因此其类型为UIButton?。因此,即使数组不能保存可选值,您也会从可选链中收到一个可选值,然后需要将其解包以使用它。

然后你可以遍历你的128按钮数组,并将它们分配给你的2D数组:

if noteUIButtonArray?.count >= 128 {
    var i = 0

    for row in 0..<8 {
        for col in 0..<16 {
            buttons2D[row][col] = noteUIButtonArray?[i++]
        }
    }
}
else {
    print("Warning: there aren't 128 buttons")
}

您可能希望以不同的顺序分配按钮。这只是一种方法的例子。