Jef*_*eff 0 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")!
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到AudioTrack不符合PlayableMediaItem协议的错误,因为该title属性不是方法,它是属性.
我怎样才能设置此让title,albumArt等可以实现为两种属性或方法,只要他们给我回到正确的类型?
我的一些实现可能只是属性,而其他的是计算.
只需将其声明为协议中的属性,并使用计算属性而不是使用方法:
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")!
}
}
Run Code Online (Sandbox Code Playgroud)