【发布时间】:2020-10-07 20:28:21
【问题描述】:
我的应用中有 2 个符合协议的简单结构,以启用一些我需要在这两种类型上应用的通用操作:
import UIKit
protocol Track {
var url: URL { get set }
}
struct TrackFromMediaFile: Track {
var url: URL
}
struct TrackFromAsset: Track {
var url: URL
}
现在我有了这些结构的列表:
var tracks = [Track]()
tracks.append(TrackFromMediaFile(url: URL(string: "http://www.remotefile")!))
tracks.append(TrackFromAsset(url: URL(string: "local://localfile")!))
我需要在这个曲目列表中找到特定曲目的索引:
// throws:
// Value of protocol type 'Track' cannot conform to 'Equatable'; only struct/enum/class types can conform to protocols
var track = tracks[0]
tracks.firstIndex(of: track)
我尝试遵循 https://stackoverflow.com/a/46719045/319905 和 https://developer.apple.com/videos/play/wwdc2015/408/ 的方法无济于事,我无法将这些方法用于我的示例。
如何以通用方式实现轨道数组的处理?
【问题讨论】:
-
出于好奇,您是否期望
TrackFromMediaFile和TrackFromAsset能够相互平等? (我假设它们具有您未在此处列出的属性,是吗?)如果是这样,您能否描述一下您希望如何比较它们的相等性? -
我会创建一个带有枚举的通用结构来区分它们。你走错了路。你不应该有一个协议的集合。
-
顺便说一句,如果你真的想走这条路(我不推荐)
let index = tracks.firstIndex(where: {track.url == $0.url}) -
看起来我的问题真的没有多大意义(equatable 不属于协议) - 我只需要在数组上使用 where 运算符。