2015-05-28 4 views
0

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

var array: [TypeOfReturn] 

for var i = 0; i < someArray.count; i++ { 
    array = someFunction() 
} 

// --- elsewhere --- 

func someFunction() -> [TypeOfReturn] { 
    // Do work 
} 

То, что я хотел бы сделать, это тип (в данном случае [TypeOfReturn]) и объявить массив вне цикла к этому типу, и это все. Я ненавижу опции и AnyObject не подходит, и синтаксис языка, похоже, не поддерживает это без каких-либо махинаций. Кто-нибудь знает, что такое эти махинации?

+0

Будет ли использование 'typealias' достаточным для ваших нужд? –

+0

Это было бы, хотя я бы предпочел что-то в строке, чтобы держать муфту свободным. Что-то отражает-у. – Hyperbole

+1

Если вы действительно не можете просто определить 'TypeOfReturn' как' struct' или 'class', вы можете рассмотреть возможность определения' TypeOfReturn' как 'protocol' –

ответ

0

Всякий раз, когда вы говорите, что «эти две вещи должны быть одного типа», вы описываете общий. К сожалению, вам придется упаковать вещи, которые используют этот тип, в один общий, но это может стоить вам. Пример:

struct S<T> { 
    var array : [T] = [] 
    func someFunction (x:T) -> [T] { 
     return [x] 
    } 
} 
var s = S<Int>() 
s.array = s.someFunction(1) 

Или это может быть, в зависимости от потребностей, что только массив должен быть внутри общей структуры:

struct S<T> { 
    var array : [T] 
} 
func someFunction(x:Int) -> [Int] { 
    return [x] 
} 
let s = S(array:someFunction(1)) 

Преимуществом второго подхода является только то, что тип Т могут быть разрешены неявно.

Смежные вопросы