Я получаю ошибки при конкатенации строки:Swift 1,2 Concatenate Строка
let likeKey = "like-" + foodPhotoObjects[indexPath.row].objectId
Ошибка
binary operator '+' cannot be applied to operands of type 'String' and 'String?!'
Я получаю ошибки при конкатенации строки:Swift 1,2 Concatenate Строка
let likeKey = "like-" + foodPhotoObjects[indexPath.row].objectId
Ошибка
binary operator '+' cannot be applied to operands of type 'String' and 'String?!'
Таким образом, у вас есть неявно обернутые факультативные факультативные строки, что-то вроде этого:
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
} ?? ""
Этот фрагмент кода может выиграть приз за наиболее необязательными обработкой методов ютятся в одном оператор ... но он должен делать то, что вам нужно.
Swift не делает неявное преобразование, даже если оба одного типа и один из них дополнительного типа.
Попробуйте это.
var concatedString = ""
if let foodphoto = foodPhotoObjects[indexPath.row].objectId as? String {
concatedString = "like-" + foodphoto
}
Это новое правило с 1.2? – Onichan
Вы также можете написать это как 'let concatedString = foodPhotoObjects [indexPath.row] .objectId.map {" like- "+ $ 0} ?? « –
@AirspeedVelocity этот комментарий работал для меня, а ответа не было. но я не уверен, что понимаю, что происходит. – Onichan