2016-11-30 2 views
3

Я пытаюсь добавить [Dictionary<String,Any!>][Dictionary<String,Any?>] кперевод [Словарь <String,Any?>] на [Словарь <String,Any!>]? скор 3

, но я получаю эту ошибку:

Cannot Convert value of Type [Dictionary] to expected argument type of [Dictionary]

Хотя я не получаю эту ошибку компиляции с swift2.

Вот мой код:

class A{ 

    var statistics = [Dictionary<String,Any!>](); 

    func1(){ 


     let oldStatiscs = self.func2() 
     //i am getting the error here. 
     self.statistics.append(oldStatiscs) 


    } 

    func2() -> [Dictionary<String,Any?>]{ 


    } 

} 

Почему я получаю эту ошибку на swift3? Почему бы мне не получить эту ошибку с помощью swift2? Как решить эту проблему?

Благодаря

+1

Любое необязательное значение в объекте Swift-in Objective-C даже не допускается - словарь бессмыслен, потому что по определению значение «nil» означает отсутствующий ключ, и вы можете удалить ключ, назначив значение «nil». – vadian

+0

@vadian благодарю вас за ваш комментарий, да, я знаю, но в настоящее время я не могу изменить его в словаре . есть ли какие-либо решения для моей проблемы? – david

+1

'[Словарь ]' является незаконным в Swift 3 как тип переменной (он может существовать только в небольшом числе мест). Вы должны изменить его. Если вы не можете его изменить, вы не можете выполнить обновление до Swift 3. Вы еще не видите ошибки, но если вы исправите все другие ошибки, вы, наконец, столкнетесь с «Неявно развернутыми опциями можно разрешить только на верхнем уровне и как результат функции ». Вы больше не можете использовать этот тип (это была бессмыслица в Swift 2, это незаконно в Swift 3). –

ответ

3

Во-первых, даже если вы меняете обоих массивов словарей до [Dictionary<String,Any>] вы все равно получите подобную ошибку. Вы пытаетесь добавить массив в массив. Поэтому в первую очередь необходимо изменить:

self.statistics.append(oldStatiscs) 

к:

self.statistics.append(contentsOf: oldStatiscs) 

Но даже с этим изменением, вы не можете добавить массив [Dictionary<String,Any?>] в массив [Dictionary<String,Any!>].

Наиболее простым решением является изменение массива [Dictionary<String,Any!>] в массив [Dictionary<String,Any?>].

Тогда вы в конечном итоге с помощью следующего рабочего кода:

class A { 
    var statistics = [Dictionary<String,Any?>](); 

    func f1() { 
     let oldStatiscs = self.f2() 
     statistics.append(contentsOf: oldStatiscs) 
    } 

    func f2() -> [Dictionary<String,Any?>] { 
     return [["Hi":"There"]] 
    } 
} 

Еще лучше избавиться от Any? и использовать Any.

class A { 
    var statistics = [Dictionary<String,Any>](); 

    func f1() { 
     let oldStatiscs = self.f2() 
     statistics.append(contentsOf: oldStatiscs) 
    } 

    func f2() -> [Dictionary<String,Any>] { 
     return [["Hi":"There"]] 
    } 
} 

Вы должны объяснить, почему вы думаете, что вы не можете изменить Any? к Any.

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