Как я могу конкатенировать несколько необязательных строк в swift 3.0?

Я пытаюсь объединить несколько строк в быстрый 3:

var a:String? = "a" var b:String? = "b" var c:String? = "c" var d:String? = a! + b! + c! 

При компиляции я получаю следующую ошибку:

 error: cannot convert value of type 'String' to specified type 'String?' var d:String? = a! + b! + c! ~~~~~~~~^~~~ 

Это использовалось для работы в swift 2. Я не уверен, почему он больше не работает.

Отчет об ошибке, поданный OP:

  • SR-1122: Неисправность цепочки типов двоичных операторов на значениях, не зависящих от силы

Который был разрешен (исправлено, чтобы овладеть 3 января 2017 года), и, следовательно, больше не будет проблемой в предстоящем Swift 3.1.


Кажется, это ошибка (нет в Swift 2.2, всего 3.0), связанная со случаем:

  • Использование оператора принудительной разворачивания ( ! ) Для не менее 3 терминов в выражении (проверено с использованием как минимум 2 основных операторов, например + или - ).
  • По какой-то причине, учитывая вышеизложенное, Swift испортил вывод типа выражения (в частности, для самих x! ) В выражении).

Для всех приведенных ниже примеров давайте:

 let a: String? = "a" let b: String? = "b" let c: String? = "c" 

Ошибка:

 // example 1 a! + b! + c! /* error: ambiguous reference to member '+' */ // example 2 var d: String = a! + b! + c! /* error: ambiguous reference to member '+' */ // example 3 var d: String? = a! + b! + c! /* error: cannot convert value of type 'String' to specified type 'String?' */ // example 4 var d: String? d = a! + b! + c! /* error: cannot assign value of type 'String' to specified type 'String?' */ // example 5 (not just for type String and '+' operator) let a: Int? = 1 let b: Int? = 2 let c: Int? = 3 var d: Int? = a! + b! + c! /* error: cannot convert value of type 'Int' to specified type 'Int?' */ var e: Int? = a! - b! - c! // same error 

Ошибка отсутствует:

 /* example 1 */ var d: String? = a! + b! /* example 2 */ let aa = a! let bb = b! let cc = c! var d: String? = aa + bb + cc var e: String = aa + bb + cc /* example 3 */ var d: String? = String(a!) + String(b!) + String(c!) 

Однако, поскольку это Swift 3.0- dev , я не уверен, что это действительно «ошибка», а также то, что политика вызывает «ошибки» в еще не-производственной версии кода, но, возможно, вы должны подать радар для этого, на всякий случай.

Что касается ответа на ваш вопрос: как обойти эту проблему:

  • используйте, например, промежуточные переменные, как в примере с Bug: Пример 2 выше,
  • или явно указать Swift, все члены в трехчленном выражении являются строками, как в Bug not present: Пример 3 выше,
  • или, еще лучше, используйте безопасную развертку вашего опционального, например, используя необязательную привязку :

     var d: String? = nil if let a = a, b = b, c = c { d = a + b + c } /* if any of a, b or c are 'nil', d will remain as 'nil'; otherwise, the concenation of their unwrapped values */ 

Swift 3

 let q: String? = "Hello" let w: String? = "World" let r: String? = "!" var array = [q, w, r] print(array.flatMap { $0 }.reduce("", {$0 + $1})) // HelloWorld! let q: String? = "Hello" let w: String? = nil let r: String? = "!" var array = [q, w, r] print(array.flatMap { $0 }.reduce("", {$0 + $1})) // Hello! 
 let val: String? = "nil" val.flatMap({(str: String) -> String? in return str + "value" }) 
 func getSingleValue(_ value: String?..., seperator: String = " ") -> String? { return value.reduce("") { ($0) + seperator + ($1 ?? "") }.trimmingCharacters(in: CharacterSet(charactersIn: seperator) ) } 
  • Когда следует использовать амперсанд с scanf ()
  • Как реализуется class StringBuilder? Внутренне ли он создает новые строковые объекты каждый раз, когда мы добавляем?
  • Каков наилучший способ создания строки разделенных элементов в Java?
  • Удалить символы после определенного символа в строке, а затем удалить подстроку?
  • Удаление дубликатов из строки в Java
  • Как Java выполняет конкатенацию строк с помощью «+»?
  • Как написать обратную косую черту (\) в строке?
  • Строковые литералы и escape-символы в postgresql
  • длина и длина () в Java
  • Как разбить строку на подстроки заданной длины?
  • Строковый вывод: формат или concat в C #?
  • Давайте будем гением компьютера.