Получение "необязательной ошибки" после обновления 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
    }    
}

Другие вопросы по тегам