【问题标题】:Why is my simple swift delegate and protocol setup not working?为什么我的简单快速委托和协议设置不起作用?
【发布时间】:2014-07-01 15:33:40
【问题描述】:

我正在尝试快速掌握委托和协议的概念。所以我实现了我自己的PlayableMedia 协议,其中有两个具体类BlueRayMediaDVDMedia,如下所示:

@protocol PlayableMedia {
    func play()
    func stop()
}

class BlueRayMedia:PlayableMedia {

    func play() {
        println("BlueRayMedia is playing")
    }

    func stop() {
        println("BlueRayMedia has stopped playing")
    }

}

class DVDMedia:PlayableMedia {

    func play() {
        println("DVD is playing")
    }

    func stop() {
        println("DVD has stopped playing")
    }


}

所以现在我有一个使用此设置的 DVDPlayer 类:

class DVDPlayer {

    var media:PlayableMedia // delegate property

    init(media:PlayableMedia){
        self.media = media
    }

    func didStartPlaying() {
       media.play()
    }

    func didStopPlaying() {
        media.stop()
    }

}

但是当我尝试这样使用它时:

var dvdPlayer:DVDPlayer = DVDPlayer(media: BlueRayMedia())

dvdPlayer.didStartPlaying()

我在操场控制台上得到(没有结果)。我做错了什么?

【问题讨论】:

  • 我不确定,但您确定这也是代表问题吗?我认为这只是一个协议问题。您的委托协议,即 PlayabeMedia 具有 no 委托属性。仅供参考,只要您有协议,就不需要委托。虽然无论你有代表,你都必须有一个协议

标签: ios delegates swift protocols


【解决方案1】:

好吧,我犯的一个简单错误是使用@protocol 而不是protocol

所以这行得通:

protocol PlayableMedia {
    func play()
    func stop()
}

【讨论】:

  • 是的,它有效。这是我在 Stackoverflow 上看到的最好的(阅读:最简单的)协议 + 委托示例。仍然不完全清楚为什么需要该协议,以及为什么不能在没有协议的情况下调用 play 和 stop?
【解决方案2】:

在操场内部 println() 不起作用。 添加一些其他表达式,例如 let x = 5

【讨论】:

  • 我不明白。我会在我的代码中哪里使用该表达式?
  • 代替 println("BlueRayMedia 正在播放") 使用 let x = 5
  • 如果你在操场上显示助理编辑器,你应该得到 println() 结果。
猜你喜欢
  • 2017-09-18
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多