Swift 2.2 ломает опции/распаковывает опции

Swift 2.2 сломал почти весь мой код. Даже это простое присвоение строки метке больше не работает:

cell.categoryName.text = peopleArray![indexPath.row]["Name"] as? String

В сообщении об ошибке говорится: «Понижение значения из строки?“ to 'String' разворачивает только необязательные параметры, вы хотели использовать '!!'?"

Какие изменения я должен сделать сейчас.

ИЗМЕНИТЬ:

Дополнительные проблемы:

if (dict["data"]!["DataDetails"] as! NSArray).count == 0 {
}

Из-за этого я получаю ошибку сегментации, и ошибка показывает следующее: предупреждение: преобразование из 'String?' для несвязанного типа 'NSArray' всегда терпит неудачу

ОБНОВЛЕНИЕ:

Я использовал NSDictionaries, NSArrays в своих классах, что, похоже, вызывает проблему. Изменение всех литералов с Obj-C на swift заставило код работать правильно. Поэтому я также рекомендую другим разработчикам предпочитать быстрые литералы.


person Bhavuk Jain    schedule 23.03.2016    source источник
comment
используйте peopleArray!["Name"] as! String .. но я предлагаю не использовать принудительную развертку .. используйте, если позволите   -  person EI Captain v2.0    schedule 23.03.2016
comment
Swift 2.2 имеет регрессию в отношении вывода типов необязательных параметров - ваша проблема может быть связана с этим: correct-in-swift-2-2" title="тип необязательных параметров не может быть правильно выведен в swift 2 2"> stackoverflow.com/questions/36160934/   -  person schmittsfn    schedule 23.03.2016
comment
Не могли бы вы написать, как вы определили свой peopleArray   -  person Sohil R. Memon    schedule 29.03.2016


Ответы (1)


кажется, есть небольшие различия при использовании типов swift и типов Objective-c NS...

eg

let dic:NSDictionary? = ["a":"a"]

let str:NSString? = dic!["a"] as? NSString

let dic2:Dictionary? = ["b":"b"]

let str2:String? = dic2!["b"] //dont need to do any casting, already optional

print(str)
print(str2)

отпечатки

Optional(a)
Optional("b")

поэтому в зависимости от того, как определен ваш массив/словарь, вам может потребоваться другое литье/развертывание

person Fonix    schedule 23.03.2016
comment
Нет, это не работает. Но если я использую peopleArray![Имя]!! как String, тогда это работает, но я хочу, чтобы это было необязательным. - person Bhavuk Jain; 23.03.2016
comment
как определяется peopleArray? - person Fonix; 23.03.2016
comment
Он определяется как NSMutableArray - person Bhavuk Jain; 23.03.2016
comment
вы имеете в виду NSmutableDictionary? так как вы «индексируете» строку - person Fonix; 23.03.2016
comment
Я обновил свой вопрос. Это было просто для справки, что опции не работают. - person Bhavuk Jain; 23.03.2016
comment
в зависимости от того, какой тип возвращает peopleArray![indexPath.row], вам, возможно, придется сначала привести это к NSDictionary, а затем получить доступ к тому, что вы хотите, из словаря, к сожалению, NSArrays всегда возвращает AnyObject, в то время как быстрые возвращают назначенный тип, можете ли вы показать, как именно вы назначаете словари и массивы, очень важно ответить на ваш вопрос. в качестве альтернативы, не используйте NSArrays и NSDictionaries в быстром режиме, если можете - person Fonix; 23.03.2016
comment
Не могли бы вы проверить обновленный вопрос выше. У меня появляются еще проблемы. Спасибо. - person Bhavuk Jain; 23.03.2016