如何使用另一个协议的属性制作一个协议,同时确保可以限制符合第一个协议的类

时间:2018-01-26 11:36:10

标签: ios swift class protocols

基本上,我的最终目标是拥有一个协议Log,强制所有符合它的对象都有一个符合另一个协议[LogEvent]的对象数组。

但是,符合Log的类需要具有特定类型的LogEvent,例如NumericalLogEvent数组中的events,而不是更一般的LogEvent

我收到错误"输入' NumericalLog'不符合协议' Log'"当我尝试使用下面的代码时。

如何确保符合日志的所有内容都具有某些事件数组,类型为LogEvent,但是它确实打开了哪个类型?

protocol Log {
    var events: [LogEvent] { get set } // Want to enforce events here
}

protocol LogEvent {
    timeStamp: Date { get set }
}

struct NumericalLogEvent: LogEvent {
    timeStamp: Date
    value: Float
}

class NumericalLog: Log {
    var events: [NumericalLogEvent]

    // But getting error here when trying to use more specific type. 
}

1 个答案:

答案 0 :(得分:1)

知道了!

诀窍是设置associatedtype(相当于协议的通用),然后将其设置为events中的类型。

protocol Log {
    associatedtype Event: LogEvent

    var events: [Event] { get set }
}