建立模型
一切的一切都要從資料說起,如果沒有資料,無論對視圖有多瑰麗的想像,也無法進行繪製。
// 結構:Position,代表一個2D座標系上的點 struct Position { var x: Int var y: Int } // 類別:World,代表世界的 Model 角色 class World { var width: Int // 世界寬度 var height: Int // 世界高度 var blocks: [[Int]] // 世界格資訊陣列 var worldView: UIView? // 用於連結世界視圖的變數 } // 類別:Block,代表方塊的 Model 角色 class Block { var position: Position // 方塊位置 var world: World? // 所屬世界 var title: String // 方塊上顯示的文字 var blockView: UILabel? // 用於連結方塊視圖的變數 }
對於方塊和世界,由於它們是屬於抽象物件類別的Class
,必須手動幫它們撰寫好初始化指令:
class World { ... // 以指定長和寬的方式初始化世界,其所有世界格,在這種方式下初始化為數值 1 init(_ w:Int, _ h:Int) { self.width = w self.height = h self.blocks = Array(repeating: Array(repeating: 1, count: w), count: h) } } class Block { ... // 以指定X座標、Y座標和標題的方式初始化方塊 init(title: String, x: Int, y: Int) { self.title = title self.position = Position(x: x, y: y) } }
眼尖的你或許會發現我們並沒有初始化所有屬性,例如World
的worldView
,或者Block
的world
,由於這些屬性是Optional
屬性,因此在初始化時如果沒有指定值,將自動指定為nil
。由於世界不一定非得有一個視圖(除非要確實繪製出來,否則即使沒有視圖,仍能操作世界的Model
,但少了長寬,顯然無法確實得清楚定義一個世界),方塊也不一定非得存在一個世界中,因此把這些屬性設置為Optional
屬性,在需要時才賦值是很恰當的。