2015-05-08 2 views
1

Я получаю ошибки при конкатенации строки:Swift 1,2 Concatenate Строка

let likeKey = "like-" + foodPhotoObjects[indexPath.row].objectId 

Ошибка

binary operator '+' cannot be applied to operands of type 'String' and 'String?!' 

ответ

1

Таким образом, у вас есть неявно обернутые факультативные факультативные строки, что-то вроде этого:

struct Thing { 
    let objectId: String?! 
} 

let foodPhotoObjects: [Thing] = [Thing(objectId: "2")] 

С любым дважды завернуты по желанию, чтобы добраться до объекта внутри вы должны были бы разворачивать его дважды:

// first unwrap the String?! into a String? 
if let outer = foodPhotoObjects[0].objectId, 
// then unwrap that String? into a String 
     inner = outer { 

    // inner is now a String 
    println("like-\(inner)") 

} 

ключевым моментом здесь является, даже если внешний опциональный неявно (т.е. !, а не ?), вы можете по-прежнему UnWrap неявные УСТРОЙСТВА U петь if let, поэтому импликация не имеет значения при этом.

Альтернативный способ обработки такого рода вещи, а не если пусть, является использование map:

let concatedString = foodPhotoObjects[indexPath.row].objectId.map { 
    "like-" + $0 
} ?? "" 

map на качестве факультативного средства: если опция содержит значение, измените значение с помощью этого функцию и вернуть это как необязательное, в противном случае возвращение nil. Итак, разверните String? и добавьте «нравится» ему.

?? по необязательному средству: если предыдущее значение равно nil, замените его по умолчанию в правой части (пустая строка), иначе разворачивайте его и возвращайте (то есть значение, которое мы только что отображали).

Теперь сложная часть: так как значение мы называем map на неявном необязательно, это будет неявно развернутым - то есть, map вызывается на внутренней String?, а не на String?!. Это не похоже на случай с if let, где это было выполнено с неявным необязательным сначала, а затем с внутренним дополнительным.

Как и со всеми неявных опциями, существует риск того, что они могли бы быть на самом деле nil в этом случае ваш код будет взорвать, например, так:

let explode = Thing(objectId: nil) 
// the next line will generate fatal error: unexpectedly 
// found nil while unwrapping an Optional value 
explode.objectId.map { "like-" + $0 } 

Если это беспокойство, вы могли бы защититься от него с некоторые дополнительные цепочки:

// note, ? after objectId 
let concatedString = foodPhotoObjects[indexPath.row].objectId?.map { 
    "like-" + $0 
} ?? "" 

Этот фрагмент кода может выиграть приз за наиболее необязательными обработкой методов ютятся в одном оператор ... но он должен делать то, что вам нужно.

1

Swift не делает неявное преобразование, даже если оба одного типа и один из них дополнительного типа.

Попробуйте это.

var concatedString = "" 
if let foodphoto = foodPhotoObjects[indexPath.row].objectId as? String { 
    concatedString = "like-" + foodphoto 

} 
+0

Это новое правило с 1.2? – Onichan

+0

Вы также можете написать это как 'let concatedString = foodPhotoObjects [indexPath.row] .objectId.map {" like- "+ $ 0} ?? « –

+0

@AirspeedVelocity этот комментарий работал для меня, а ответа не было. но я не уверен, что понимаю, что происходит. – Onichan

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