簡體   English   中英

Swift:在協議中使用未定義的函數嗎?

[英]Swift: Working undefined functions in protocols?

我有一個這樣的協議:

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

像這樣的結構:

struct Factory {
  let robot: Robot
  func testRobot() {
    robot.beep()
    robot.boop()
  }
  func killRobot() {
    robot.explode()
  }
}

它們都可以正常工作(至少在理論上是這樣),並且應該與Robot協議兼容。

但是,如果我有這樣的結構:

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

然后XCode不會編譯它,因為我沒有定義嗶聲或嗶聲。 但是,如果我仍然定義它們,這些函數將為空:

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

有辦法解決這個問題嗎? 編寫不執行任何操作的代碼行似乎很奇怪。

工廠接受任何機器人,因此可以更容易地調用嗶嗶聲和噓聲,而不必擔心它們是否工作,因此我寧願避免進行一些可能的復雜檢查。

謝謝你的幫助!

編輯:這個問題與這里的這個相同,對不起大家

正如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")
   }
}

那個怎么樣:

   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")
    }
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM