Быстрое необязательное сцепление с NSDictionary

Пожалуйста, помогите переделать это

 if let field = parent_obj?.getFieldForCode(code) {
    if let stored_value = field["value"] as? String {

в необязательный синтаксис цепочки в одну строку. Я пытался сделать это так:

let stored_value = parent_obj?.getFieldForCode(code)?["value"] as? String

и получил ошибку:

Type 'String' does not conform to protocol 'NSCopying'

Это мой заголовок функции:

func getFieldForCode(code: String) -> NSDictionary? 

Является ли это возможным? Я спрашиваю об этом, потому что каждый раз, когда я работаю с NSArrays и NSDictionaries, мой код выглядит ужасно:

if let code = self.row_info["code"] as? String {
        if let value_field = self.row_info["value_field"] as? String {
            if let field = parent_obj?.getFieldForCode(code) {
                if let stored_value = field["value"] as? String {
                    if let fields = self.fields_set{
                        if let current_value = fields[indexPath.row][value_field] as? String {

Любые советы?

1 ответ

Решение

Вы не можете разыграть его напрямую String потому что вы тянете его из NSDictionary и, как говорит ошибка, String не соответствует NSCopying, Тем не мение, String соединен с NSString, а также NSString соответствует NSCopying, Таким образом, с помощью небольшого количества хитростей приведения / связывания, вы можете заставить его работать так:

let stored_value: String? = parent_obj?.getFieldForCode(code)?["value"] as? NSString

Примечание: если вы используете это в необязательном связывании (которое выглядит так, как вы хотите), не забудьте опустить ? от stored_value объявление типа:

if let stored_value: String = parent_obj?.getFieldForCode(code)?["value"] as? NSString {
    /* ... */
}
Другие вопросы по тегам