Swift - фильтрует объекты, которые соответствуют универсальному протоколу - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь понять, как фильтровать объекты, которые соответствуют универсальному протоколу.
Давайте предположим, что у меня есть эта настройка (которая прекрасно компилируется):

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-протокол как тип и получать только соответствующие подпредставления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...