2014-09-07 3 views
0

Недавно я обновил свой Xcode 6 beta 6 до Xcode 6 beta 7, и внезапно части моего кода не компилируются. У меня есть эта функция в моем коде, которая дает мне ошибку Связанное значение в условной привязке должно быть опционного типа на линии if let layoutManager = textView.layoutManager.Получение «необязательной ошибки» после обновления Xcode 6 beta 6 до бета-версии 7

func textTapped(recognizer: UITapGestureRecognizer){ 
    self.textHasBeenTapped = true 

    if let textView = recognizer.view as? UITextView{ 
     if let layoutManager = textView.layoutManager { 
     // rest of code 

     } 
    } 

Я попытался сделать TextView дополнительный тип, как показано ниже (который удаляет первоначальную ошибку), но вместо этого он дает ошибку Значение дополнительного типа "CGFloat? не разворачивается; вы хотели использовать '!' или '?'? на линии location.x = textView?.textContainerInset.left. Если я вставляю либо !, либо ? после left, он вместо этого дает мне ошибку: Операнд постфикса '!' должен иметь необязательный тип; type is '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 
     } 
    } 
} 

Какой был бы лучший способ исправить эту проблему?

ответ

2

Ваша первоначальная проблема связана с тем, что свойство layoutManager UITextView было изменено в бета-версии 7, так что оно больше не является необязательным. Поэтому гарантируется, что он не будет равен нулю, поэтому вам не нужна проверка if let...; вы можете просто использовать значение.

Ваше создание textView a 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 
    }  
} 

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