Я пытаюсь создать "отфильтрованный" массив типа протокола
У меня есть ряд структур (Assessment, Level и Gate), которые соответствуют нескольким различным протоколам - Stageable, Repeatable и Testable:
protocol Stageable
{
var index : Int { get }
var steps : [Step] { get }
}
protocol Testable
{
var threshold : Float { get }
}
protocol Repeatable
{
var sessions: Int { get }
}
struct Gate : Stageable, Testable, Repeatable
{
private(set) var index : Int
private(set) var steps : [Step]
private(set) var threshold : Float
private(set) var sessions : Int
}
struct Assessment : Stageable, Testable
{
private(set) var index : Int
private(set) var steps : [Step]
private(set) var threshold : Float
}
struct Level : Stageable, Repeatable
{
private(set) var index : Int
private(set) var steps : [Step]
private(set) var sessions : Int
}
Шаг - еще одна структура. Классы не используются.
Эти структуры заполняются непосредственно перед добавлением в массив. Массив обычно имеет форму [Оценка, Гейт, Уровень, Уровень]. Все данные структур заполняются из файла XML.
В некоторых случаях я хочу просмотреть только «Уровни» в массиве, поэтому я делаю следующее:
// stages = [Assessment, Gate, Level, Level, ...]
let levels = stages.filter{ $0 is Level }
Если я запрошу это, все будет хорошо, например. Levels.count - это то, что я ожидал. Однако, если я теперь хочу преобразовать массив в [Уровень], он вылетает со следующей ошибкой:
fatal error: can't unsafeBitCast between types of different sizes
Это потому, что я выполняю преобразование из протокола в тип структуры? Я также чувствую, что упустил ключевые преимущества протоколов здесь, и должен быть лучший способ сделать это.
В настоящее время используется Xcode 7 beta 5.