2015-02-16 2 views
0

Скажем, у вас есть класс C. Он имеет две переменные экземпляра, число и вектор. вектор - это просто массив или ints или double.Как вы перегружаете оператора быстрым?

Я хотел бы сделать следующее:

c1 = C() 
c1.number = 2 
c1.vector = [1,2,3] 
c2 = C() 
c2.number = 3 
c2.vector = [4,6,7] 

println(c1.number + c2.number) \\print to screen 5 
println(c1.vector + c2.vector) \\ print [5,8,10] 

В принципе, я ищу перегрузить оператор «+», так что он знает, какую «версию» на «+», чтобы использовать в зависимости от тип.

+0

Я думаю, что один '+' уже определен (int + int). Просто объявите инфиксный оператор для 'Vector', как описано в справочнике Swift. P.479. –

+0

. См. Документацию Apple: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html# // apple_ref/doc/uid/TP40014097-CH27-ID42 –

+0

Извините, я обновил свой вопрос. Вектор не является классом. Это всего лишь массив типа T, который должен сказать, что это всего лишь массив или ints или double. – user678392

ответ

0

Оператор + уже определен для типа Array. Он объединяет массив и присваивает значения rvalue на lvalue. Для того, чтобы сделать сумму значений по индексу вы можете сделать что-то вроде этого:

protocol Numeric { } 

extension Double: Numeric {} 
extension Int: Numeric {} 

func +<T: Numeric>(left: [T], right: [T]) -> [T]? { 
    var numElements: Int = 0 

    if count(left) != count(right) { 
     return nil 
    } else { 
     numElements = count(left) 
    } 

    var result = [T]() 

    for var i = 0; i < numElements; ++i { 
     if let lvalue = left[i] as? Int, rvalue = right[i] as? Int { 
      result.append(lvalue + rvalue as! T) 
     } else if let lvalue = left[i] as? Double, rvalue = right[i] as? Double { 
      result.append(lvalue + rvalue as! T) 
     } 
    } 

    return result 
} 

Но в целом, я бы не советовал перекрывая предопределенную операцию из-за высокого потенциала, чтобы вызвать путаницу и хаос позже вниз по дороге.

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