2015-02-04 9 views
8

Я хотел бы написать расширение для кортежей (например,) двух значений в Swift. Например, я хотел бы написать этот swap метод:Могу ли я продлить Tuples в Swift?

let t = (1, "one") 
let s = t.swap 

таким образом, что s бы типа (String, Int) со значением ("one", 1). (Я знаю, что я могу очень легко реализовать функцию swap(t), но это меня не интересует.)

Могу ли я это сделать? Я не могу написать правильное имя типа в объявлении extension.

Кроме того, и я полагаю, что ответ один и тот же, могу ли я сделать 2-кортеж принять данный протокол?

+1

[Быстрая документация для типов] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Types.html) устраняет между * именованными типами * и * составными типами *. Именованные типы могут быть расширены, но кортежи (и функции) являются составными типами. –

+0

Спасибо, Мартин. Похоже, это определенная «нет». Можете ли вы включить его в ответ, чтобы я мог принять его? –

+0

Большинство настроек, которые вы можете выполнять с помощью Tuples, это имена параметров и использование 'typealias' для него. Для чего-то более сложного вы должны использовать 'struct' или определять глобальные функции (может быть, с генериками) – DeFrenZ

ответ

21

Вы не можете распространять типы кортежей в Swift. Согласно Types, есть названные виды (которые могут быть расширены) и типы соединений. Кортежи и функции являются составными типами .

Смотрите также (подчеркивание добавлено):

Extensions
Расширения добавляют новые функциональные возможности существующего класса, структуры или перечисления типа.

5

Как сказано выше, вы не можете распространять кортежи в Swift. Однако, вместо того, чтобы просто дать вам нет, вы можете сделать коробку с кортежем внутри class, struct или enum и расширить это.

struct TupleStruct { 
    var value: (Int, Int) 
} 
extension TupleStruct : Hashable { 
    var hashValue: Int { 
     return hash() 
    } 
    func hash() -> Int { 
     var hash = 23 
     hash = hash &* 31 &+ value.0 
     return hash &* 31 &+ value.1 
    } 
} 

func ==(lhs: TupleStruct, rhs: TupleStruct) -> Bool { 
    return lhs.value == rhs.value 
} 

В качестве примечания, в Swift 2.2, кортежи с до 6 членов теперь Equatable.