ios - 如何使一个协议(protocol)具有另一个协议(protocol)的属性,同时确保可以限制符合第一个协议(protocol)的类

标签 ios swift class protocols

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

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

当我尝试使用下面的代码时,出现错误“类型‘NumericalLog’不符合协议(protocol)‘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. 
}

最佳答案

知道了!

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

protocol Log {
    associatedtype Event: LogEvent

    var events: [Event] { get set }
}

关于ios - 如何使一个协议(protocol)具有另一个协议(protocol)的属性,同时确保可以限制符合第一个协议(protocol)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48460612/

相关文章:

c++ - 具有不同模板类型的子类的多态性

ios - 当我使用 Ionic 2 在 iOS 上单击后退按钮时,如何阻止导航栏消失?

ios - 使用 UIApplicationShortcutItem 启动

c++ - 在 C++ 中使用类的命名空间定义类的成员

ios - 使用 Swift 将 JSON 字符串转为 NSDictionary

ios - Swift:JSONEcoder EXC_BAD_ACCESS

c++ - 从文件中读取值并使用类

iphone - iOS 5 中的 iPad 方向问题

iOS 应用程序因安装错误而随机崩溃

ios - 第一次刷新表格时,圆形图像是方形的