Как я могу определить постфиксный оператор в кортеже?

#swift #tuples #custom-operator

#swift #кортежи #пользовательский оператор

Вопрос:

У меня есть следующий код:

 postfix operator ^^^
public postfix func ^^^(lhs: Int) -> Int {
    return 0
}

public postfix func ^^^<T>(lhs: (T, T)) -> [T] {
    return [lhs.0, lhs.1]
}

func go() {
    1^^^ // this works
    (0, 0)^^^ // error: Unary operator '^^^' cannot be applied to an operand of type '(Int, Int)'
}
  

Для чего я получаю ошибку, Unary operator '^^^' cannot be applied to an operand of type '(Int, Int)' . Есть идеи, как это исправить?

Комментарии:

1. Да, я понимаю, что вы имеете в виду! Похоже, что постфиксные операторы не работают с кортежами. На самом деле не очень удивительно. Возможно, вы могли бы использовать вместо этого struct в вашем реальном варианте использования. Кортежи — это действительно своего рода нестандартный тип, и есть много вещей, которые они не выполняют (например, равенство кортежей также всегда было серьезной проблемой).

2. Никогда даже не думал о том, чтобы определять операторы для кортежей. Хотя, если бы я увидел (0, 0)^^^ в кодовой базе, головы бы покатились: p

3. Кортежи имеют несколько очень полезных применений в качестве последовательностей, например: (x, y, width, height) = ("x", "y", "width", "height")^^^.map { dict[$0] } для получения фрейма из словаря String to Int .

4. @Alexander Я просто использовал, ^^^ чтобы очень ясно дать понять, что это не существующий оператор с конфликтами: P

5. Основная причина, по которой операторы хороши для кортежей, заключается в том, что вы не можете их расширять, поэтому о добавлении методов не может быть и речи. И вы можете выполнять инфиксные операторы для кортежей. Просто не постфиксный, я полагаю?

Ответ №1:

Это известная ошибка, сравните префиксные и постфиксные операторы, не работающие для типов кортежей на форуме Swift, и SR-294 Странные ошибки для унарного префиксного оператора с аргументом кортежа.

Это было исправлено для Swift 5, следующее компилируется и запускается в Xcode 10.2 beta 4:

 postfix operator ^^^

public postfix func ^^^<T>(lhs: (T, T)) -> [T] {
    return [lhs.0, lhs.1]
}

let x = (0, 0)^^^
print(x) // [0, 0]