五、Swift Class類別練習一:動物朋友

Yenci
彼得潘的 Swift iOS / Flutter App 開發教室
5 min readAug 22, 2023

先設定一個動物的類別,既不是六隻腳的昆蟲,也不是有細胞壁的植物,就是一隻動物。

class Animal {
func walk() {
print("I can walk.")
}
func sounds() {
print("Yeeeeeeeeeee")
}
}

然後再產生一隻動物,並讓他發出叫聲。

let animal = Animal()
animal.sounds()

現在動物發出了Yeeeeeeeeeee的叫聲。

接下來我想要以Animal為base class,讓一個新的類別Cat繼承自Animal。

如此Cat類別就會繼承Animal的走路跟發出叫聲的function。

但貓貓顯然不是發出Yeeeeeeeeeee的叫聲,貓咪是喵喵叫(尤其是牠想要罐罐的時候)。這時候就要重新宣告這個繼承自Animal類別的sounds function。

只要寫出:func sounds,Xcode就會自動幫我們加上前綴override。

class Cat: Animal {
override func sounds() {
print("Meowwwwwwwww")
}
}
let cat = Cat()
cat.sounds()

最後再instance出一隻貓貓,讓牠喵喵叫。

做一個傑克的類別,設定初始值的屬性。

class Jack: Cat {
var name:String = "Jack"
var personality:String = "自戀"

override func sounds() {
print("嚴肅。")
}
func fishing() {
print("釣魚。")
}
}
let jack = Jack()
print(jack.name)
print(jack.personality)
jack.sounds()
jack.fishing()

發現在類別宣告的時候,要記得用var,否則會像下圖一樣,變得無法幫傑克改名。

Jacky的鼻子有幾個~

那麼我現在改成用var建立,如此一來屬性可以成功更改:

class Jack: Cat {
var name:String = "Jack"
var personality:String = "自戀"

override func sounds() {
print("嚴肅。")
}
func fishing() {
print("釣魚")
}
}
var jack = Jack()
jack.name = "Jacky"
print(jack.name)

如果我用let建立(類別宣告時依然需要用var),我發現傑克的名字仍然可以改變。為什麼呢?跑去爬文找到了解答,詳見下方參考文章連結。

建立實例時,不論我用var還是let,都能成功改變實例的屬性。

因為Class 是 reference type ,所以他有Mutability的特性。這時候jack實例只是一個參考,參考Cat這個實體。

(能不能說成:我們其實並沒有複製貼上一個新的實體呢?中文似乎很難解釋它,雖然看英文的更不懂)

class Jack: Cat {
var name:String = "Jack"
var personality:String = "自戀"

override func sounds() {
print("嚴肅。")
}
func fishing() {
print("釣魚")
}
}
let jack = Jack()
jack.name = "Jacky"
print(jack.name)

例如:UiView、UIImageView等元件。參考蘋果文件,寫著它們是Class,它們不就是蘋果幫我們建好的Class嗎?

用let建立一個UIImageView實例之後,理所當然能夠改顏色改大小改位置。

let cranyonShinChann = UIImage(named: "800x拷貝.png")
let cranyonShinChannView = UIImageView(image: cranyonShinChann)
cranyonShinChannView.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.1)

下一篇Class練習打算來學Initializer。

參考文章:

--

--