Я пытался сделать это так много, но быстрый компилятор жалуется на все, что я делаю. SourceKit и компилятор также аварийно завершаются, поэтому я больше не могу экспериментировать. Даже не вставлять некоторые println
s. Я разрываю волосы.Создание массива типа протокола @objc из массивов конформеров
Я пытаюсь построить простой массив для представления табличного представления. «Строки» - это объекты Presentable
, которые представляют собой всего лишь набор протоколов.
import Foundation
// The protocols are all @objc
typealias Presentable = protocol<Utterable, Displayable, Departure>
typealias TableSection = (sectionTitle: String, rows: [Presentable])
1. Это не работает:
(buses, metros
и т.д., все [Bus]?, [Metro]?
и т.д., и эти классы соответствуют всем протоколам, которые Presentable
)
private func asContent5() -> [TableSection]
{
var result: Array<TableSection> = []
var deptsCollections: [[Presentable]?] = [ buses, metros, trains, trams, ships ]
for var i = 0; i<deptsCollections.count ; i++ {
if let departures = deptsCollections[i]? {
var newDeparturesArray: [Presentable] = []
for dep in departures
{
newDeparturesArray.append(dep) // EXC_BAD_INSTRUCTION
}
let tuple: TableSection = (sectionTitle: "test", rows: newDeparturesArray)
result.append(tuple)
}
}
return result
}
консоли выход:
fatal error: NSArray element failed to match the Swift Array Element type
2. Это «работает» (т. не врезаться во время выполнения), но я, кажется, не получить ни одного объекта в моем новом массиве:
private func asContent4() -> [TableSection]
{
var result: Array<TableSection> = []
var deptsCollections: [AnyObject?] = [ buses, metros, trains, trams, ships ]
for var i = 0; i<deptsCollections.count ; i++ {
if let departures: [Presentable] = deptsCollections[i] as? [Presentable] {
var newDeparturesArray: [Presentable] = []
for dep in departures
{
newDeparturesArray.append(dep as Presentable)
}
let tuple: TableSection = (sectionTitle: "test", rows: newDeparturesArray)
result.append(tuple)
}
}
return result
}
3. Это работает полностью:
private func asContent3() -> [TableSection]
{
var result: Array<TableSection> = []
if let departures = buses {
var newDeparturesArray: [Presentable] = []
for dep in departures { newDeparturesArray.append(dep as Presentable) }
let tuple: TableSection = (sectionTitle: "bus", rows: newDeparturesArray)
result.append(tuple)
}
if let departures = metros {
var newDeparturesArray: [Presentable] = []
for dep in departures { newDeparturesArray.append(dep as Presentable) }
let tuple: TableSection = (sectionTitle: "metro", rows: newDeparturesArray)
result.append(tuple)
}
if let departures = trains {
var newDeparturesArray: [Presentable] = []
for dep in departures { newDeparturesArray.append(dep as Presentable) }
let tuple: TableSection = (sectionTitle: "trains", rows: newDeparturesArray)
result.append(tuple)
}
if let departures = trams {
var newDeparturesArray: [Presentable] = []
for dep in departures { newDeparturesArray.append(dep as Presentable) }
let tuple: TableSection = (sectionTitle: "trams", rows: newDeparturesArray)
result.append(tuple)
}
if let departures = ships {
var newDeparturesArray: [Presentable] = []
for dep in departures { newDeparturesArray.append(dep as Presentable) }
let tuple: TableSection = (sectionTitle: "ships", rows: newDeparturesArray)
result.append(tuple)
}
return result
}
Все, что я хочу, чтобы взять мой buses, metros, trains, trams, ships
и поместите их в [Presentable]
каждый, без стены кода. Я начинаю верить, что это невозможно в Свифт, потому что мне кажется, что я переписал эти петли всеми возможными способами.
Что мне не хватает? Почему я не могу, кажется, повторить успешную попытку, а не повторять весь этот код?
Update
Это то, что происходит с Davids кодом:
тот же выход консоли, как описано выше, но на этот раз он выходит из строя при попытке получить доступ к TableSection :: строк (то есть случилось со мной и раньше). Это делает его крах:
println("index path s: \(indexPath.section) r: \(indexPath.row)")
let section = tableContent[indexPath.section]
println("row count: \(section.rows.count)")
let departure: Presentable = section.rows[indexPath.row] // crash
Console (я напечатал rows
массив из переменных View):
index path s: 0 r: 0
row count: 8
fatal error: NSArray element failed to match the Swift Array Element type
Printing description of section.rows:
([protocol<Departure, Displayable, Utterable>]) rows = {}
Является ли это только мне или не эти цифры складываются?
Причина может быть объяснена здесь: http://stackoverflow.com/questions/24113354/array-element-cannot-be-bridged-to- object-c Ваш массив-мосты в 'var deptsCollections: [[Presentable]?] = [buses]' не будет работать –
Может быть. Я смог назначить 'var myPresentables: [Представляемый]? = автобусы. Я знаю, что это сомнительное назначение, потому что массив имеет тип [Bus], а не [Presentable], но я не уверен, если это имеет значение. Он разбивает тип безопасности, но он скомпилирован, и он работал до тех пор, пока он был [@objc protocol] ... – Andreas