Приведение Swift Dictionary к CFDictionary

Как правильно преобразовать словарь в Swift 3 в CFDictionary? Законно ли так писать?

 var dictionary:Dictionary<NSString, Int> = [:]

а потом

 dictionary as CFDictionary

person Deepak Sharma    schedule 21.04.2017    source источник
comment
Да, иначе бы компилятор жаловался.   -  person vadian    schedule 21.04.2017
comment
Насколько я знаю, Apple не предлагает напрямую обращаться с CFDictionary. NSObject хорошо спроектированы и оптимизированы для Key-Value Coding, а CF — нет. Вы можете что-то упустить, если будете обрабатывать CF объекты напрямую.   -  person Blind Ninja    schedule 21.04.2017
comment
О, спасибо, только что поправил. Вопрос в том, можно ли его напрямую отлить в CFDictionary или нет.   -  person Deepak Sharma    schedule 21.04.2017
comment
@DeepakSharma Ты пробовал?   -  person Hamish    schedule 21.04.2017
comment
@ХарвантС. Для некоторых функций CoreFoundation требуются типы CF, поэтому у вас нет выбора. Мостовой гипс в полном порядке.   -  person vadian    schedule 21.04.2017
comment
Я не могу попробовать, поскольку я переношу приложение на Swift, я вынужден передать CFDictionary в качестве входных данных для функциональной части платформы Core Video. Потребуется еще пара тысяч строк кода, чтобы проверить, правильно ли ведет себя функция с этим приведением типов.   -  person Deepak Sharma    schedule 21.04.2017
comment
@vadian я знаю об этом. но ОП ничего об этом не упоминает. @DeepakSharma в этом случае просто перебросит ваш объект NS в CFRef.   -  person Blind Ninja    schedule 21.04.2017
comment
Конечно, вы можете попробовать. Просто напишите около 3 строк кода, и ваш тест готов.   -  person rmaddy    schedule 21.04.2017
comment
@ rmaddy пытается увидеть, дает ли он правильный вывод, не гарантирует, что он всегда будет работать и соответствует стандартам. В iOS есть тысячи таких примеров, когда код работает, но никогда не был частью документации, поэтому на него нельзя положиться. В конце концов, многие такие сегменты кода были сломаны в обновлениях iOS, что заставило разработчиков задуматься.   -  person Deepak Sharma    schedule 22.04.2017
comment
конечно, вы можете попробовать, это плохой совет, потому что он может вести себя так, как вы ожидаете в тестовом примере, но все равно будет неправильным. Например, это может вызвать утечку памяти, поскольку CF может потребовать явного выпуска, если он не управляется. Ваш тест этого не покажет.   -  person wcochran    schedule 27.05.2017


Ответы (1)


Да, вы можете это сделать. ваше решение будет работать, и вы также можете сделать это так.

var dictionary = [

    key:value

] as CFDictionary

Вы можете обратиться к здесь

person iOS_MIB    schedule 21.04.2017
comment
Остается вопрос: нужно ли по-прежнему вызывать CFRelease для словаря, поскольку компилятор не управляет типами CF? - person wcochran; 27.05.2017
comment
Вы можете использовать CFRelease, но не рекомендуется использовать его в Swift. Apple предоставляет два метода takeUnretainedValue() и takeRetainedValue(), с помощью которых вы можете преобразовывать неуправляемые объекты в управляемые. Вы можете использовать эти методы для преобразования ваших неуправляемых объектов CF в управляемый объект, и его память будет управляться быстрым. Чтобы узнать больше, прочитайте это: developer.apple.com/ библиотека/контент/документация/Swift/ - person iOS_MIB; 29.05.2017