簡體   English   中英

如何定義Swift協議,以便實現可以是屬性或方法?

[英]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,然后在實現該協議的類上可以操縱其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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM