Получение "необязательной ошибки" после обновления Xcode 6 beta 6 до beta 7
Я недавно обновил свою Xcode 6 beta 6 до Xcode 6 beta 7, и внезапно части моего кода не скомпилировались. У меня есть эта функция в моем коде, которая дает мне ошибку Значение привязки в условной привязке должно быть необязательного типа в строке if let layoutManager = textView.layoutManager
,
func textTapped(recognizer: UITapGestureRecognizer){
self.textHasBeenTapped = true
if let textView = recognizer.view as? UITextView{
if let layoutManager = textView.layoutManager {
// rest of code
}
}
Я попытался сделать textView необязательным типом, как показано ниже (который удаляет первоначальную ошибку), но вместо этого он выдает ошибку Value необязательного типа 'CGFloat?' не развернутый; ты хотел использовать '!' или же '?'? на линии location.x = textView?.textContainerInset.left
, Если я вставлю либо !
или же ?
после left
вместо этого он дает мне ошибку: операнд постфикса '!' должен иметь необязательный тип; тип 'CGFloat', предлагая мне удалить либо '!' или же '?' таким образом делая своего рода цикл ошибок.
func textTapped(recognizer: UITapGestureRecognizer){
self.textHasBeenTapped = true
if let textView: UITextView? = recognizer.view as? UITextView{
if let layoutManager = textView?.layoutManager {
var location: CGPoint = recognizer.locationInView(textView)
location.x = textView?.textContainerInset.left
// rest of code
}
}
}
Как лучше всего решить эту проблему?
1 ответ
Ваша первоначальная проблема на самом деле связана с тем, что свойство layoutManager в UITextView было изменено в бета-версии 7, так что оно больше не является необязательным. Поэтому гарантированно не будет ноль, так что вам не нужно if let...
проверять; Вы можете просто использовать значение.
Ваше превращение textView в Optional просто привело к еще большей путанице; Вы должны оставить это как необязательное.
Вот как я это напишу, с некоторыми комментариями, объясняющими мои изменения.
func textTapped(recognizer: UITapGestureRecognizer) {
// You didn't need the self bit here.
textHasBeenTapped = true
// textView should be non-optional, and you don't need to bother
// specifying the type, as it can be inferred from the cast.
if let textView = recognizer.view as? UITextView {
// You don't need if let... here as layoutManager is now non-optional
let layoutManager = textView.layoutManager
// You don't need to specify the type here, as it can be inferred
// from the return type of locationInView
var location = recognizer.locationInView(textView)
location.x = textView.textContainerInset.left
// rest of code
}
}