【发布时间】:2020-11-16 15:55:21
【问题描述】:
我目前正在学习 Swift 的泛型,但在将协议与泛型类一起使用时遇到了问题。我需要创建 4 个继承自 AWMediaItemWrapper 泛型类的包装类。
public class MPMediaItemWrapper<M: MPMediaEntity> {
internal let value: M
init(_ value: M) {
self.value = value
}
}
MPMediaEntity 是来自MediaPlayer 框架的抽象类。从它继承的三个子类是一样的:
public class MPTrack: MPMediaItemWrapper<MPMediaItem> {}
public class MPAlbum: MPMediaItemWrapper<MPMediaItem> {}
public class MPArtist: MPMediaItemWrapper<MPMediaItem> {}
除了第四个:
public class MPPlaylist: MPMediaItemWrapper<MPMediaPlaylist> {}
我还有一个协议AWMediaItem,它定义了一些属性和方法
public protocol AWMediaItem: class {
/// Unique identifier of the item.
var uid: String { get }
/// Name used to identify the item, for example album title or artist name.
var name: String { get }
/// Source of the object.
var source: AWMediaSource { get }
...
}
现在我想做的是为MPMediaItemWrapper 子类创建一个默认的AWMediaItem 实现,其中M 类是MPMediaEntity(MPMediaItem 和MPMediaPlaylist 都是它的子类)
我已经写了这段代码
public extension AWMediaItem where Self: MPMediaItemWrapper<MPMediaEntity> {
var source: AWMediaSource {
return .iTunes
}
var uid: String {
return String(value.persistentID)
}
}
它没有给我错误,但编译器说所有三个子类都缺少协议要求。
类型“MPArtist”不符合协议“AWMediaItem”
类型“MPAlbum”不符合协议“AWMediaItem”
类型“MPTrack”不符合协议“AWMediaItem”
类型“MPPlaylist”不符合协议“AWMediaItem”
如果我将协议扩展更改为
public extension AWMediaItem where Self: MPMediaItemWrapper<MPMediaItem>
满足MPTrack、MPAlbum 和MPArtist 的协议要求,但不满足MPPlaylist 的协议要求。有什么方法可以编写扩展使其适用于所有这些子类?
【问题讨论】:
-
复制粘贴....没有编译器错误。 Xcode 12.1 / iOS 14.1。你没有忘记什么吗?
-
您需要实际尝试使 4 个子类符合协议才能查看编译器错误。
-
没错,@flanker
标签: ios swift generics swift-protocols