2016-08-15 3 views
1

У меня есть протокол, как это:Swift массив объектов соответствует протоколу

protocol Datable { 
    var date: NSDate { get set } 
} 

struct DEPref: Datable { 
    var date: NSDate 
} 

struct DEPObs: Datable { 
    var date: NSDate 
} 

func fetchDepRefs() -> [DEPRef] {...} 
func fetchDepObss() -> [DEPObs] {...} 

Я хотел бы создать массив DEPref и DEPObs для сортировки окончательного списка.

Я пробовал много вещей, но компилятор жалуется. Пример:

var depRefList: Array<Datable> = fetchDepRefs() 
var depObsList: Array<Datable> = fetchDepObss() 
var allDeps = ... 

ошибка в первой строке «Невозможно преобразовать значение типа [DEPref] для указанного типа Array»

+1

См [это Q & A] (http://stackoverflow.com/questions/37188580/why-isnt-somestruct-convertible-to- any) для получения дополнительной информации о том, почему преобразование этого типа не выполняется. – Hamish

+0

Если вы чувствуете, что ответ решил проблему, отметьте ее как «принятую», нажав зеленую галочку. Это помогает сосредоточиться на более старых SO, которые до сих пор не имеют ответов. – sineil

ответ

3

Я новичок в программировании Swift/IOS, но что-то вроде это работает для меня.

func fetchDepRefs() -> Array<Datable> {return Array<Datable>()} 

var depRefList = fetchDepRefs() 
var testDEPref = DEPref(date: NSDate()) 
var testDEPref2 = DEPref(date: NSDate()) 

depRefList.append(testDEPref) 
depRefList.append(testDEPref2) 

for ref in depRefList { 
    print(ref.date) 
} 

Ваши функции могут также возвращать [датируемый]

например.

func fetchDepRefs() -> [Datable] {return [Datable]()} 

Это также работает для вашего сценария

Edit:

Или, если вы ищете безопасности типа в ваших функциях, следующий код будет работать

func fetchDepRefs() -> [DEPref] {return [DEPref]()} 
func fetchDepObss() -> [DEPObs] {return [DEPObs]()} 

var depRefList = fetchDepRefs() 
var depObsList = fetchDepObss() 

var allDeps: [Datable] = [Datable]() 

В вы можете добавить элементы из depRefList и depObsList в allDeps, и все будет работать нормально.

Редактировать снова:

Это полностью рабочий пример того, что вы пытаетесь достичь. В этом я использую функцию карты для преобразования элементов данных массивов датируемых объектов

protocol Datable { 
    var date: NSDate { get set } 
} 

struct DEPref: Datable { 
    var date: NSDate 
} 

struct DEPObs: Datable { 
    var date: NSDate 
} 

func fetchDepRefs() -> [DEPref] {return [DEPref]()} 
func fetchDepObs() -> [DEPObs] {return [DEPObs]()} 

var depRefs = fetchDepRefs() 
var depObs = fetchDepObs() 

var ref1 = DEPref(date: NSDate()) 
var obs1 = DEPObs(date: NSDate()) 

depRefs.append(ref1) 
depObs.append(obs1) 

var allDeps = depRefs.map{$0 as Datable} + depObs.map{$0 as Datable} 


for x in allDeps { 
    print("I'm in allDeps array: \(x.date)") 
} 
+0

Спасибо за ваш ответ, но я хотел бы сохранить мои функции «извлечения» с конкретным типом возврата и не возвращать протокол. Как вы можете объединить два массива depRefList и depObsList? – samir

+0

Если вы видите мое последнее редактирование, я сделал именно это. :) – sineil

+0

Моя цель состоит в том, чтобы объединить два массива, а затем отсортировать окончательный массив по дате – samir

2

Использует Swift 2 на прошивке? Следующие работает успешно на Swift 3.

      http://swiftlang.ng.bluemix.net/#/repl/57b13a01133614f70db3347e

protocol Datable { 
    var date: NSDate { get set } 
} 

struct Type1: Datable { 
    var date: NSDate 
} 

struct Type2: Datable { 
    var date: NSDate 
} 

var x : Datable = Type1(date:NSDate()) 
var y : Datable = Type2(date:NSDate()) 

var array : [Datable] = [x, y] 

var x2 : Datable = Type1(date:NSDate()) 
var y2 : Datable = Type2(date:NSDate()) 

array.append(x2) 
array.append(y2) 
0

Самый простой способ заключается в использовании map:

var depRefList: Array<Datable> = fetchDepRefs().map { $0 as Datable } 
var depObsList: Array<Datable> = fetchDepObss().map { $0 as Datable } 
var allDeps = (depRefList + depObsList) 
      .sort { $0.date.timeIntervalSince1970 > $1.date.timeIntervalSince1970 } 

так depRefList является [Datable] и fetchDepRefs() является [DEPref], Тэй разные типа, поэтому необходимо передать [DEPref] в [Datable], функция map сделает это за вас. растекания Код:

var depRefList: Array<Datable> = fetchDepRefs().map { $0 as Datable } 

равна:

let depRefs: [DEPref] = fetchDepRefs() 

var datables = [Datable]() 

for depRef in depRefs { 
    let datable = depRef as Datable 
    datables.append(datable) 
} 

var depRefList: Array<Datable> = datables 
Смежные вопросы