一般來說,要把事情做好,有兩種哲學,一種是「第一次就把它做對」,好的開始是成功的一半,就像建造橋梁,一旦打下基礎,後面想改設計就很難了,所以一定要謀定而後動,一次就做到位。

另一種比較適合程式設計的哲學是「逐步改善」。軟體的東西很難一次就做到位,LINE, Youtube 這些一開始的功能都相當簡單,經過多年的改善才逐漸成熟,而且未來也還會繼續改進,沒有極限。

想像設計一個App程式,可瀏覽30個商王角色,當使用者點選某位商王「武丁」時,虛擬角色「武丁」就跳出來介紹他的時代,講述他與妻子「婦好」征戰四方的故事,以及從各地收集的寶藏,最後再和使用者來一場樸克牌比大小,可以贏得他的寶物,讓使用者在遊戲中學習歷史。

設計App通常從這樣天馬行空的「概念」開始,先設計粗略的原型,包括物件的資料格式以及簡略的互動流程,然後再逐步改善。

目前我們先只做個「自我介紹」功能,列印一段文字,等以後我們能夠處理語音、影片、圖形等多媒體資料時,就能夠加入更多的動作與功能,逐步改善便能完成一個App。

// 1-8b struct: 商王年表v3
// Created by Heman, 2021/07/26
// Reference: <https://zh.wikipedia.org/wiki/商朝>

struct 商王 {
    var 名號: String
    var 即位: Int    //西元年
    var 在位: Int    //年

    func 自我介紹() -> String {
        let 西元年 = 即位 < 0 ? "西元前\\(abs(即位))年" : "西元\\(即位)年"
        let 介紹詞 = "我是商王「\\(名號)」,\\(西元年)即位,在位\\(在位)年。"
        return 介紹詞
    }
}

let 商王世系: [商王] = [
    商王(名號: "大乙湯", 即位: -1558, 在位: 12),
    商王(名號: "外丙勝", 即位: -1546, 在位: 2),
    商王(名號: "仲壬庸", 即位: -1544, 在位: 4),
    商王(名號: "大甲至", 即位: -1540, 在位: 12),
    商王(名號: "沃丁絢", 即位: -1528, 在位: 19),
    商王(名號: "大庚辯", 即位: -1509, 在位: 5),
    商王(名號: "小甲高", 即位: -1504, 在位: 17),
    商王(名號: "大戊密", 即位: -1487, 在位: 75),
    商王(名號: "雍己伷", 即位: -1412, 在位: 12),
    商王(名號: "中丁莊", 即位: -1400, 在位: 9),
    商王(名號: "外壬發", 即位: -1391, 在位: 10),
    商王(名號: "河亶甲整", 即位: -1381, 在位: 9),
    商王(名號: "祖乙滕", 即位: -1372, 在位: 19),
    商王(名號: "祖辛旦", 即位: -1353, 在位: 14),
    商王(名號: "沃甲踰", 即位: -1339, 在位: 5),
    商王(名號: "祖丁新", 即位: -1334, 在位: 9),
    商王(名號: "南庚更", 即位: -1325, 在位: 6),
    商王(名號: "陽甲和", 即位: -1319, 在位: 4),
    商王(名號: "盤庚旬", 即位: -1315, 在位: 28),
    商王(名號: "小辛頌", 即位: -1287, 在位: 3),
    商王(名號: "小乙斂", 即位: -1284, 在位: 10),
    商王(名號: "武丁昭", 即位: -1274, 在位: 59),
    商王(名號: "祖庚曜", 即位: -1215, 在位: 11),
    商王(名號: "祖甲載", 即位: -1204, 在位: 33),
    商王(名號: "廩辛先", 即位: -1171, 在位: 4),
    商王(名號: "庚丁囂", 即位: -1167, 在位: 8),
    商王(名號: "武乙瞿", 即位: -1159, 在位: 35),
    商王(名號: "文丁托", 即位: -1124, 在位: 13),
    商王(名號: "帝乙羨", 即位: -1111, 在位: 9),
    商王(名號: "帝辛紂", 即位: -1102, 在位: 52)]

for 帝王 in 商王世系 {
    print(帝王.自我介紹())
}

在這個範例程式中,幾個重要的「物件」概念,包括物件類型(x1)、物件屬性(x3)、物件方法(x1)以及物件實例(x30),分別標示如下圖。

下一節:1-8c 物件的初始化