2016-08-17 5 views
1

После обновления до Xcode 8 бета-6, я получаю следующее сообщение об ошибке:Неоднозначность ошибка в Xcode 8 бета 6

Value of type 'Any' has no member 'cgRectValue'

на следующем блоке:

var tmpContentViewFrameOrigin: CGPoint? 
var tmpCircleViewFrameOrigin: CGPoint? 
var keyboardHasBeenShown:Bool = false 

func keyboardWillShow(_ notification: Notification) { 
    keyboardHasBeenShown = true 
    if let userInfo = (notification as NSNotification).userInfo { 
     if let beginKeyBoardFrame = userInfo[UIKeyboardFrameBeginUserInfoKey]!.cgRectValue.origin.y { 
      if let endKeyBoardFrame = userInfo[UIKeyboardFrameEndUserInfoKey]?.cgRectValue.origin.y { 
       tmpContentViewFrameOrigin = self.contentView.frame.origin 
       tmpCircleViewFrameOrigin = self.circleBG.frame.origin 
       let newContentViewFrameY = beginKeyBoardFrame - endKeyBoardFrame - self.contentView.frame.origin.y 
       let newBallViewFrameY = self.circleBG.frame.origin.y - newContentViewFrameY 
       self.contentView.frame.origin.y -= newContentViewFrameY 
       self.circleBG.frame.origin.y = newBallViewFrameY 
      } 
     } 
    } 
} 

и эти две линии специально :

if let beginKeyBoardFrame = userInfo[UIKeyboardFrameBeginUserInfoKey]!.cgRectValue.origin.y { 
    if let endKeyBoardFrame = userInfo[UIKeyboardFrameEndUserInfoKey]?.cgRectValue.origin.y { 

Возможно, мне не хватает чего-то такого простого ... любых предложений?

ответ

0

cgRectValue является собственностью класса NSValue. Что вы получаете из словаря userInfo, как известно, не является NSValue, поэтому вы не можете получить доступ к объектам NSValue.

Для компилятора, чтобы позволить вам использовать эти свойства, вы должны позволить ей знать, что вы ожидаете, что значение быть NSValue:

if let beginKeyBoardFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.origin.y { 

(Это не привело к ошибкам компилятора раньше, потому что словари импортированные API-интерфейсы Cocoa, объединенные с типом значений AnyObject. AnyObject имеет некоторую магию, такую ​​как тип ObjC id, поскольку компилятор позволит вам вызвать любой метод/свойство на нем - результат завершен в Optional, потому что он может не существовать. что словари имеют Any как свой тип значения, вам нужно явно сказать, что вы ожидаете от стоимости e type будет.)

+0

wow, это имеет смысл. Я просматривал часть userInfo нового документа, но не мог вынюхивать все, что указывало на это. Спасибо, в любом случае! –

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