我正在尝试将UIButtons的一维数组转换为它们的二维数组。为了做到这一点,我需要用nil值实例化一个空的二维UIButtons数组,然后我可以指向一维UIButton数组中的相应UIButton。因为我是Swift的新手,所以我对Optionals感到困惑。这是我的一维数组:
@IBOutlet var noteUIButtonArray: [UIButton]?
我想将这个128大小的一维数组转换成具有will值的U-DUTuttons的二维[8] [16]数组。我该怎么做?提前致谢。
答案 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
。如果noteUIButtonArray
为nil
,那么可选链将为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")
}
您可能希望以不同的顺序分配按钮。这只是一种方法的例子。