我如何定义一个 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 属性 不是方法,它是 属性。

我如何设置它以便 titlealbumArt 等可以作为 属性或方法来实现,只要它们还我正确的类型?

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

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

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)
}}