[英]How can I define a Swift Protocol so that the implementation can be a property _or_ a method?
這是我想做的:
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
等均可實現為屬性或方法,只要他們給我回到正確的類型?
我對此的一些實現可能只是屬性,而其他實現是經過計算的。
只需在協議中將其聲明為屬性,然后使用計算的屬性而不是使用方法即可:
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")!
}
}
更改您的協議以使用屬性而不是函數。 通過這種方式,實現struct / class可以決定將其實現為不動產還是經過計算的財產。
protocol PlayableMediaItem {
var title: String { get }
var albumArt: UIImage { get }
var audioFileURL: URL { get }
}
並不是完全確定您需要什么,因為這取決於但可以嘗試使它們成為變量而不是funcs,然后在實現該協議的類上可以操縱其var的獲取/設置。
struct Square {
var edge: Double = 0
var area: Double {
get {
return edge * edge
}
set {
edge = sqrt(newValue)
}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.