#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)^^^
в кодовой базе, головы бы покатились: p3. Кортежи имеют несколько очень полезных применений в качестве последовательностей, например:
(x, y, width, height) = ("x", "y", "width", "height")^^^.map { dict[$0] }
для получения фрейма из словаряString
toInt
.4. @Alexander Я просто использовал,
^^^
чтобы очень ясно дать понять, что это не существующий оператор с конфликтами: P5. Основная причина, по которой операторы хороши для кортежей, заключается в том, что вы не можете их расширять, поэтому о добавлении методов не может быть и речи. И вы можете выполнять инфиксные операторы для кортежей. Просто не постфиксный, я полагаю?
Ответ №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]