iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0

方法

程式設計裡面 方法太重要了
當然~也有人習慣叫他函數
每個方法我們可以看做一個命令

這其中有兩個知識點可以讓大家去研究

  1. Functional programming
    好的FP可避免大量的重複程式碼
    也可以有清晰的程式邏輯

  2. 單一職責
    方法即是命令
    所以一個好的方法 應該清楚又明確
    一個方法 應該只做一件事情
    看似簡單又廢話的一段話
    在真正實作時
    是需要大量經驗與知識才能達成的

swift

// 一般方法
func sayHi(_ name: String) -> String {
    // 如果name 拿掉前方的 _   呼叫必須變成 sayHi(name: "Ami")
    return "你好啊 \(name)!"
}
print(sayHi("Ami")) //你好啊 Ami!

// 可變參數, 每個方法最多只可以有一組
func sayHiFoEeveryone(_ name: String...) -> String {
    return "你們好啊 \(name)!"
}
print(sayHiFoEeveryone("Ami1","Ami2","Ami3","Ami4"))
// 你們好啊 ["Ami1", "Ami2", "Ami3", "Ami4"]!


// 命名參數 主要是增加可讀性
func sayHiFrom(from: String, to: String) -> String {
    return "\(from)說: 你好啊 \(to)!"
}
print(sayHiFrom(from: "Ami", to:"Amit"))
// Ami說: 你好啊 Amit!

//print(sayHiFrom( to:"Amit", from: "Ami"))
// 編譯錯誤 命名參數必須順序正確

swift的命名參數
對提升可讀性上有很大的加分喔

kotlin

// 一般方法
fun sayHi(name: String): String {
    return "你好啊 $name!"
}

// 可變參數, 每個方法最多只可以有一組
fun sayHiFoEeveryone(vararg name: String): String {
    val names = name.toList().toString()
    return "你們好啊 $names!"
}

// 命名參數 主要是增加可讀性
fun sayHiFrom(from: String, to: String): String {
    return "${from}說: 你好啊 $to!"
}

fun main() {
	println(sayHi("Ami")) //你好啊 Ami!
    println(sayHiFoEeveryone("Ami1","Ami2","Ami3","Ami4")) //你們好啊 [Ami1, Ami2, Ami3, Ami4]!
    println(sayHiFrom(from = "Ami", to = "Amit")) // Ami說: 你好啊 Amit!
    println(sayHiFrom( to = "Amit", from = "Ami"))// Ami說: 你好啊 Amit! 
}

Swift參數設定嚴謹
Kotlin 相對較寬鬆
這樣的設計可以帶來比較大的彈性
不需要順序一樣
這在後續擴充參數上有很大的幫助

但較高的彈性 相對的也會帶來較高的混亂
用與不用~ 你自己決定摟

類別

啊呀~類別啊~太重要了
物件導向中 類別是一個太重要的概念了
如果你對類別~物件導向都沒概念
建議你停下來
先去補一些基本知識再往下走摟

swift

// protocol 就是swift的介面或契約
protocol IAnimal {
    func eat()
    func sleep()
}

class Animal: IAnimal {
    func eat() {
        print("開始吃飯摟~ 吃吃吃!")
    }
    func sleep() {
        print("開始睡覺!")
    }
}

class Cat: Animal {
    var name: String = ""
    var age: Int = 0

    init(_ name: String){
        self.name = name
    }

    func meow() {
        print("\(name): meow ~")
    }
    // 覆寫方法使用關鍵字 override
    override func sleep() {
        print("本大爺要先來吃個宵夜~然後...")
        // 呼叫父層
        super.sleep()
    }
}

var mycat = Cat("Tom")
mycat.meow();
mycat.eat();
mycat.sleep();

interface 在這裡變成 protocol
使用上沒太大差異

但我特別喜歡他 override關鍵字的使用
清楚明瞭的標示這段在做什麼

特別提醒 在類別內
指實體化後的自己
使用的是 self

kotlin

// interface 就是介面 可以定義行為
interface IAnimal {
    fun eat()
    fun sleep()
}

class Animal: IAnimal {
    // 實作界面需要寫關鍵字 override
    override fun eat() {
        println("開始吃飯摟~ 吃吃吃!")
    }
    override fun sleep() {
        println("開始睡覺!")
    }
}
// 不行 class Cat(name: String): Animal  , kotlin裡 類別與介面都只能擴展一層
class Cat(name: String): IAnimal {
    var name: String = ""
    var age: Int = 0

    init{
        this.name = name
    }

    fun meow() {
        println("$name: meow ~")
    }
    
    // 覆寫方法使用關鍵字 override
    override fun eat() {
        println("開始吃飯摟~ 吃吃吃!")
    }
    override fun sleep() {
        println("本大爺要先來吃個宵夜~然後...")
        println("開始睡覺!")
    }
}


fun main() {
	var mycat = Cat("Tom")
    mycat.meow();
    mycat.eat();
    mycat.sleep();
}

kotlin在類別擴展上給出了限制
不管是介面還是類別 都只能擴展一層
這徹底解決了其他語言中 類別擴展過深的問題
這個限制 會迫使開發者更遵守SOLID原則
不然....就可能面對超級多的重複程式碼

當然還是有關鍵字可以取消這個限制
這邊就不特別介紹摟

kotlin 與 Swift 基礎語法差異

不大! 差異真的不大!!!
如果單純看成是寫法 大同小異
主要還是後面的應用上差異應該會比較大喔

小碎嘴時間 ヽ(゚´Д`)ノ゚

終於啊~~~ v( ̄︶ ̄)y
該死的基礎語法終於結束了
明天開始要打開編輯器
進入快樂的寫APP環節了

其實我很多很多年以前 有用Java開發過一款APP
是在做臨時工人力媒合的

當年的我...沒經驗...當工程師才一年...
就被抓去開發APP 「(°ヘ°)

那時真是忙到昏天暗地啊~~
想想當初... 一切都是淚!

經過幾年的演進
APP開發應該變得更好上手了吧?

對吧? Android 大大????
Swift: 怎麼不問問我.... ⸍⚙̥ꇴ⚙̥⸌


上一篇
[Day08] swift & kotlin 入門篇!(6) 流程控制-循序,選擇,重複
下一篇
[Day10] swift & kotlin 實作篇!(1) 開發工具與環境安裝
系列文
雙平台APP小遊戲開發實作! Swift & Kotlin 攜手出擊~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言