我想解码协议的扩展:
protocol SettingsContentProtocol: Codable {
var audioDelegate:AudioDelegate? { get set }
var isPlaying: Bool { get set }
var meditationTimes: [MeditationItem: TimeInterval] {get set}
var intermediate: Int {get set}
var contentsDuration: Float {get set}
var durata:TimeInterval {get set}
var parzialeDurata:TimeInterval {get set}
var date: Date {get set}
var hour: Int {get}
var followDuration: TimeInterval {get set}
func selectPeriod(item:MeditationItem)
mutating func sliderMoved(item: MeditationItem, sliderPosition: Float)
func calculateContentsDuration()->Float
func tooShortTimeForContents(completion:@escaping ((Bool)->Void))
func cleanQueue(items:[MPMediaItem])
func selectRow(indexPath: IndexPath)
func tableEdit(indexPath: IndexPath)
func rowAt(indexPath: IndexPath, tableView: UITableView)->UITableViewCell
mutating func adjustProgress(progress: TimeInterval)
mutating func prepareMeditation()
func meditationDetails()->Meditation
func meditationMessage(final: Bool)->String
func meditationTime()->String
}
带有:
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
isPlaying = try container.decode(Bool.self, forKey: .isPlaying)
meditationTimes = try container.decode([MeditationItem: TimeInterval].self, forKey: .meditationTimes)
intermediate=try container.decode(Int.self, forKey: .intermediate)
contentsDuration=try container.decode(Float.self, forKey: .contentsDuration)
durata=try container.decode(TimeInterval.self, forKey: .durata)
parzialeDurata=try container.decode(TimeInterval.self, forKey: .parzialeDurata)
date=try container.decode(Date.self, forKey: .date)
followDuration=try container.decode(TimeInterval.self, forKey: .followDuration)
}
然而,当我编译时,每一行都会出现错误:
"'self"在"self.init"调用或分配给"self"之前使用">
我发现的所有示例似乎都与我的代码一致,但可能出了什么问题?
通过在每个采用结构的协议中设置一个标准init((来解决这个问题,我从init(from:(调用它,如下所示:
func encode(to encoder: Encoder) throws{
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(isPlaying, forKey: .isPlaying)
try container.encode(meditationTimes, forKey: .meditationTimes)
try container.encode(intermediate, forKey: .intermediate)
try container.encode(durata, forKey: .durata)
try container.encode(parzialeDurata, forKey: .parzialeDurata)
try container.encode(date, forKey: .date)
try container.encode(followDuration, forKey: .followDuration)
}
init(from decoder: Decoder) throws {
self.init()
let container = try decoder.container(keyedBy: CodingKeys.self)
isPlaying = try container.decode(Bool.self, forKey: .isPlaying)
meditationTimes = try container.decode([MeditationItem: TimeInterval].self, forKey: .meditationTimes)
intermediate=try container.decode(Int.self, forKey: .intermediate)
durata=try container.decode(TimeInterval.self, forKey: .durata)
parzialeDurata=try container.decode(TimeInterval.self, forKey: .parzialeDurata)
date=try container.decode(Date.self, forKey: .date)
followDuration=try container.decode(TimeInterval.self, forKey: .followDuration)
}