Я пытаюсь понять, как фильтровать объекты, которые соответствуют универсальному протоколу.
Давайте предположим, что у меня есть эта настройка (которая прекрасно компилируется):
public protocol StoryItem {
var id: Int64? { get }
}
public protocol Restorable: AnyObject {
associatedtype T : StoryItem
var storyItem: T? { get set }
}
public struct LabelItem: StoryItem {
public var id: Int64?
public var text: String?
}
public struct StickerItem: StoryItem {
public var id: Int64?
public var imageName: String?
}
class LabelView: UILabel, Restorable {
var storyItem: LabelItem?
}
class StickerView: UIImageView, Restorable {
var storyItem: StickerItem?
}
И если у меня естьUIView
с несколькими подпредставлениями, которые некоторые из них соответствуют Restorable
, а некоторые нет, и я хочу получить только подпредставления, которые соответствуют Restorable
, я обычно делаю это:
let restorableSubviews = superview.subviews.compactMap({$0 as? (Restorable & UIView)})
Но я получаю следующую ошибку компиляции:
Protocol 'Restorable' can only be used as a generic constraint because it has Self or associated type requirements
Я прочитал много ответов в SOF, но не смог обойти этот.Как заставить компилятор уважать мой generic-протокол как тип и получать только соответствующие подпредставления?