如何定义Swift协议以使实现可以是属性_或_方法?

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等可以实现为两种属性或方法,只要他们给我回到正确的类型?

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

Nob*_*ica 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")!
    }
}
Run Code Online (Sandbox Code Playgroud)