这就是我想要做的事情:
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
属性不是方法,它是属性。
如何进行此设置,以便title
,albumArt
等可以作为 属性或方法实现,只要它们让我回到正确的位置即可类型?
我的一些实现可能只是属性,而其他的是计算。
答案 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)
}}