我如何定义一个 Swift 协议,以便实现可以是一个 属性 _or_ 方法?
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 然后在实现协议的 类 上你可以操纵它们的 get/set 变量。
struct Square {
var edge: Double = 0
var area: Double {
get {
return edge * edge
}
set {
edge = sqrt(newValue)
}}
这是我想要做的:
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 然后在实现协议的 类 上你可以操纵它们的 get/set 变量。
struct Square {
var edge: Double = 0
var area: Double {
get {
return edge * edge
}
set {
edge = sqrt(newValue)
}}