Swift 3: объединение нескольких строк с оператором + больше невозможно

В Swift 2.3 у меня был этот рабочий простой фрагмент кода:

let joinedString = partOne! + PartTwo! + PartThree! + PartFour!

Теперь, с переходом на swift 3, я неожиданно наткнулся на 24 ошибки с самыми расплывчатыми объяснениями. Вот одна из них:

Та же строка кода выдает ошибку:

Ambiguous reference to member '+'

Однако, если я разделю их так:

let OneAndTwo = partOne! + partTwo!
let ThreeAndFour = partThree! + PartFour!
let joinedString = OneAndTwo + ThreeAndFour

Это работает ... Они удалили связывание нескольких строк, как это, или это глючит? Похоже, компилятор считает, что «+» - это переменная или что-то еще с таким же именем?

РЕДАКТИРОВАТЬ:

Несмотря на то, что это еще одна ошибка, похоже, она связана с: ?noredirect=1&lq=1">Этот вопрос

Также происходит сбой, когда вы идете вверх по 2 необязательным строкам. Я думаю, что необязательная привязка - это путь. Похоже, этот баг существует уже довольно давно.


person BossBols    schedule 14.09.2016    source источник
comment
Посмотрите эту демонстрацию (Swift Ver. 3.0 (выпуск), платформа: Linux (x86_64)) - если вы используете только строки, вы можете комбинировать их с +.   -  person Wiktor Stribiżew    schedule 14.09.2016
comment
Спасибо .. Мои четыре части тоже были String, но они необязательны. (Метод, который их объединяет, действует только тогда, когда они действительно существуют), так что, возможно, это было частью проблемы. Я продолжу использовать свой двухкомпонентный подход, но мне все еще очень любопытно, почему :)   -  person BossBols    schedule 14.09.2016
comment
Чтобы добавить: я только что попробовал это с дополнительными опциями, и песочница вылетает с той же ошибкой, но с дополнительной информацией. Даже строка печати, соединяющая три строки, дает сбой, когда вы добавляете третий вариант: swiftlang.ng.bluemix .net/#/repl/57d8fea044c863091c3eaf7c   -  person BossBols    schedule 14.09.2016
comment
Другой обходной путь: let joinedString = "" + partOne! + partTwo! + partThree! + partFour!.   -  person OOPer    schedule 14.09.2016


Ответы (1)


Это похоже на ошибку, и я буду исследовать дальше. Если мы моделируем поведение ! с другим оператором, все работает нормально:

postfix operator |! {}
postfix func |! <T>(rhs: T?) -> T {
    return rhs!
}

let s1: String? = "Hello"
let s2: String? = " "
let s3: String? = "World"
let joined = s1|! + s2|! + s3|! // "Hello World"
person Qbyte    schedule 14.09.2016
comment
Спасибо, дайте нам знать, если вы найдете что-то еще. Я отредактировал ссылку выше. По-видимому, ошибка существует уже довольно давно и иногда указывает на String как на виновника, а в моем случае оператор, зависящий от переменной joinString, является необязательным или нет. - person BossBols; 14.09.2016