如何定义Swift协议以使实现可以是属性_或_方法?

时间:2017-06-08 17:53:27

标签: swift swift-protocols

这就是我想要做的事情:

import Foundation
import UIKit

protocol PlayableMediaItem {
    func title() -> String
    func albumArt() -> UIImage
    func audioFileURL() -> URL
}


struct AudioTrack : Codable, PlayableMediaItem {
    var title: String
    var desc:String
    var albumArtDemoName:String
    var audioDemoFilename:String

    func albumArt() -> UIImage {
        let image = UIImage(named: albumArtDemoName)
        return image!
    }

    func audioFileURL() -> URL {
        return Bundle.main.url(forResource: audioDemoFilename, withExtension: "mp3")!
    }
}

但我得到的错误是AudioTrack不符合PlayableMediaItem协议,因为title属性不是方法,它是属性。

如何进行此设置,以便titlealbumArt等可以作为 属性或方法实现,只要它们让我回到正确的位置即可类型?

我的一些实现可能只是属性,而其他的是计算。

3 个答案:

答案 0 :(得分:5)

只需将其声明为协议中的属性,并使用计算属性而不是使用方法:

import Foundation
import UIKit

protocol PlayableMediaItem {
    var title: String { get } 
    var albumArt: UIImage { get }
    var audioFileURL: URL { get }
}


struct AudioTrack : Codable, PlayableMediaItem {
    var title: String
    var desc:String
    var albumArtDemoName:String
    var audioDemoFilename:String

    var albumArt: UIImage {
        let image = UIImage(named: albumArtDemoName)
        return image!
    }

    var audioFileURL: URL {
        return Bundle.main.url(forResource: audioDemoFilename, withExtension: "mp3")!
    }
}

答案 1 :(得分:1)

更改协议以使用属性而不是函数。这样实现struct / class可以决定将它实现为不动产或计算结构。

protocol PlayableMediaItem {
    var title: String { get }
    var albumArt: UIImage { get }
    var audioFileURL: URL { get }
}

答案 2 :(得分:0)

不完全确定你需要什么,因为它取决于但是可能尝试使它们变量而不是funcs然后在实现协议的类上你可以操纵它们的var的get / set。

struct Square {
 var edge: Double = 0
 var area: Double {
get {
  return edge * edge
}
set {
  edge = sqrt(newValue)
}}