我有一個這樣的協議:Swift:在協議中使用未定義的函數?
protocol Robot {
func beep()
func boop()
func explode()
}
而且一個結構是這樣的:
struct Factory {
let robot: Robot
func testRobot() {
robot.beep()
robot.boop()
}
func killRobot() {
robot.explode()
}
}
他們都工作得不錯(至少在理論上),並應與機器人協議的任何工作。
但是,如果我有這樣的結構:
struct UselessRobot: Robot {
init() {
explode()
}
func explode() {
print("BANG")
}
}
隨後的XCode不會編譯它,因爲我沒有定義蜂鳴或BOOP。但是,如果我定義它們,函數將是空的:
extension Robot {
func beep() {}
func boop() {}
func explode() {}
}
有沒有辦法解決這個問題?編寫無所事事的代碼行看起來很奇怪。
工廠接受任何機器人,所以它更容易調用嘟嘟聲和噓聲,而不用擔心它們是否工作,所以我寧願避免做一些複雜的檢查,如果可能的話。
感謝您的幫助!
EDIT: This question is the same as this one here, sorry everyone
簡短的回答:沒有。較長的回答:協議旨在輕量級且不包含實施。通過這種方式,您可以確定所有的UselessRobot實現實際上都是結構的一部分,並且不必搜索可能包含其他實現的協議Robot。並且'func beep(){}'這一行包含了信息 - 它告訴你UselessRobot嘟嘟聲不會執行任何操作。 – Gerriet
協議只是函數的定義。不是實現。我們必須在類/結構中實現它們並編寫我們自己的邏輯。 –