2017-05-09 51 views
0

我有一個這樣的協議: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

+2

簡短的回答:沒有。較長的回答:協議旨在輕量級且不包含實施。通過這種方式,您可以確定所有的UselessRobot實現實際上都是結構的一部分,並且不必搜索可能包含其他實現的協議Robot。並且'func beep(){}'這一行包含了信息 - 它告訴你UselessRobot嘟嘟聲不會執行任何操作。 – Gerriet

+0

協議只是函數的定義。不是實現。我們必須在類/結構中實現它們並編寫我們自己的邏輯。 –

回答

0

正如Gerriet說,簡單的答案是否定的。

如果您定義了機器人協議,但是一些或大多數機器人不會實現嘟嘟聲或噓聲,那麼您的協議並不真正有用。

你能更具體,但...

protocol Robot { 
    func explode() 
} 

protocol NoisyRobot: Robot { 
    func beep() 
    func boop() 
} 

struct QuietRobot: Robot { 
    func explode() { 
     print("bang") 
    } 
} 

struct LoudRobot: NoisyRobot { 
    func explode() { 
     print("bang") 
    } 

    func beep() { 
     print("beep") 
    } 

    func boop() { 
     print("boop") 
    } 
} 
+0

您的'LoudRobot'也需要實現'explode',因爲結構不支持繼承 – Paulw11

+0

好的現貨!,謝謝 – Scriptable

+0

好的,謝謝@Scriptable!但是,你會推薦我對工廠做些什麼?該協議對此很有幫助,因爲它可以很容易地調用任何一個Robot的主要功能。有沒有更好的方法來做到這一點? – MysteryPancake

0

怎麼樣:

protocol Robot { 
     //func beep() 
     //func boop() 
     //func explode() 
    } 

    extension Robot { 
    func beep() {} 
    func boop() {} 
    func explode() {} 
    } 

    struct UselessRobot: Robot { 
    init() { 
     explode() 
    } 
    func explode() { 
     print("BANG") 
    } 
    } 
+0

仍然沒有在擴展中定義任何內容......這對我來說似乎浪費了代碼(儘管它並不多) – MysteryPancake