2014-09-03 2 views
3

Среди потоп ошибок я получил от обновления до бета-версии 7 я получил именно этот тот, который делает меня головной царапать ...Xcode 6 Beta7 NSDictionary Свифта

 let views:NSDictionary = 
     [ 
      "leftView": _leftVC.view, 
      "rightView": _rightVC.view, 
      "outerView": _scrollView.superview 
     ]; 

Ошибка: Невозможно преобразовать выражение» t введите «Словарь» типа «StringLiteralConvertible» Метод, которому нужны «представления», требует NSDictionary, поэтому я не могу просто использовать Swift Dictionary.

Как бы я адаптировал вышеуказанный код, чтобы удовлетворить Xcode6 Beta7?

+1

Пробовал ли вы сначала установить 'views', а затем, когда вы вызываете метод, бросая' views' в NSDictionary? Я считаю, что это то, что Apple говорила в некоторых своих обходных решениях. – Rikkles

ответ

7

Проблема заключается в том, что UIScrollView.superview является необязательным, так что вы должны поставить развернутый значение в словаре

let views:NSDictionary = 
[ 
    "leftView": _leftVC.view, 
    "rightView": _rightVC.view, 
    "outerView": _scrollView.superview! 
]; 

Используйте безопасный логика вместо неявно развернутый (т.е. проверить, что superview не ноль), если вы на 100% уверены, что он содержит значение, отличное от нуля.

Даже если переменная views имеет NSDictionary типа, словарь буквальным используется для инициализации она принимает значение быстрого словаря - это то тихо мостик к NSDictionary.

Причина, по которой компилятор жалуется, заключается в том, что если _scrollView.superview необязательно, он может быть равен нулю, и это недопустимо.

Как отметил @JackLawrance, словарь может иметь неравномерные типы значений даже при инициализации литералами.

Sidenote: когда мы получим более значимые сообщения об ошибках? :)

+0

Спасибо за разъяснение, в чем проблема! – BadmintonCat

+1

Литерал словаря, который используется для построения 'NSDictionary', не требует однородных типов. Кроме того, во всех случаях словарный литерал не требует единообразных типов, если типы имеют общий супер-тип. Например, тип этого литерала - '[String: UIView?]'. То, что на самом деле происходит здесь, это Swift пытается помешать вам случайно помещать 'nil' в' NSDictionary', что является общей ошибкой в ​​Objective-C, что приведет к сбою во время выполнения, потому что 'NSDictionary' не может содержать' nil'. Сообщение об ошибке довольно плохо. –

+0

Спасибо @JackLawrence, спасибо, что указали это. – Antonio

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