Я играю с новым Swift от Apple языком программирования и у меня есть некоторые проблемы ...
В настоящее время я пытаюсь прочитать файл plist, в Objective-C я бы сделал следующее, чтобы получить содержимое в виде NSDictionary:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
Как мне получить список в качестве словаря в Swift?
Я предполагаю, что могу получить путь к списку с помощью:
let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
Когда это работает (если это правильно?): Как получить контент в качестве словаря?
Также более общий вопрос:
Можно ли использовать классы NS * по умолчанию ? Я так думаю ... или я что-то упустил? Насколько я знаю, стандартные рамки NS * классы все еще действительны и в порядке?
Ответы:
В Свифт 3.0 Чтение из Плиста.
Прочитайте больше КАК ИСПОЛЬЗОВАТЬ СПИСКИ НЕДВИЖИМОСТИ (.PLIST) В SWIFT .
источник
Вы все еще можете использовать NSDictionaries в Swift:
Для Swift 4
Для Swift 3+
И старые версии Swift
Классы NSC по-прежнему доступны и отлично подходят для использования в Swift. Я думаю, что они, вероятно, скоро захотят сместить фокус на swift, но в настоящее время быстрые API не обладают всей функциональностью базовых NSClasses.
источник
mainBundle()
это как разmain
в Swift 3NSArray/NSDictionary
данные списка свойств.PropertyListSerialization
(и в Swift 4 альтернативноCodable
протокол) является соответствующим API. Он обеспечивает современную обработку ошибок, и данные могут быть преобразованы непосредственно в собственные типы коллекций Swift.Вот что я делаю, если хочу преобразовать .plist в словарь Swift:
Отредактировано для Swift 2.0:
Отредактировано для Swift 3.0:
источник
NSArray/NSDictionary
для чтения данных списка свойств.PropertyListSerialization
(и в Swift 4 альтернативноCodable
протокол) является соответствующим API. Он обеспечивает современную обработку ошибок, и данные могут быть преобразованы непосредственно в собственные типы коллекций Swift.Swift 4.0
Теперь вы можете использовать Decodable протокол для декодирования .plist в пользовательскую структуру. Я рассмотрю базовый пример, для более сложных структур .plist, которые я рекомендую прочитать в Decodable / Encodable (хороший ресурс здесь: https://benscheirman.com/2017/06/swift-json/ ).
Сначала настройте вашу структуру в формате вашего файла .plist. Для этого примера я рассмотрю .plist с словарём корневого уровня и 3 записями: 1 строка с ключом «name», 1 Int с ключом «age» и 1 Boolean с ключом «single». Вот структура:
Достаточно просто. Теперь классная часть. Используя класс PropertyListDecoder, мы можем легко проанализировать файл .plist для создания этой структуры:
Не намного больше кода для беспокойства, и все это в Swift. Более того, теперь у нас есть экземпляр структуры Config, которую мы можем легко использовать:
Это печатает значение для ключей «name», «age» и «single» в .plist.
источник
Bundle.main.url(forResource: "Config", withExtension: "plist")
и не избавитьсяURL(fileURLWithPath
? И поскольку файл должен существовать (во время разработки / компиляции), все значения можно принудительно развернуть. Код не должен падать, если все спроектировано правильно.url(forResource: "Config", withExtension: "plist")
я просто сопоставлял то, что ОП сделал в своем коде, для сравнения. Что касается силы, разворачивающей все, я стараюсь ошибиться в сторону осторожности. Я думаю, что это основной вопрос для Swift в целом. Я предпочел бы точно знать, что мой код будет делать в любой ситуации, чем сбой.decoder.decode([Config].self, from: data)
. (Обратите внимание на квадратные скобки вокруг [Config])Этот ответ использует нативные объекты Swift, а не NSDictionary.
Swift 3.0
источник
Я работал с Swift 3.0 и хотел предоставить ответ на обновленный синтаксис. Кроме того, и, возможно, что еще более важно, я использую PropertyListSerialization объект для выполнения тяжелой работы, которая намного более гибкая, чем просто использование NSDictionary, поскольку она позволяет использовать массив как корневой тип plist.
Ниже приведен скриншот используемого мной списка. Это немного сложно, чтобы показать доступную мощность, но это будет работать для любой допустимой комбинации типов списков.
Как вы можете видеть, я использую словари Array of String: String для хранения списка названий веб-сайтов и соответствующих им URL.
Я использую объект PropertyListSerialization , как упоминалось выше, чтобы сделать тяжелую работу для меня. Кроме того, Swift 3.0 стал более «Swifty», поэтому все имена объектов потеряли префикс «NS».
После того как приведенный выше код
plist
будет иметь типArray<AnyObject>
, но мы знаем, какой это действительно тип, поэтому мы можем привести его к правильному типу:И теперь мы можем получить доступ к различным свойствам нашего массива строк: строковых словарей естественным образом. Надеюсь превратить их в настоящие строго типизированные структуры или классы;)
источник
Лучше всего использовать собственные словари и массивы, потому что они были оптимизированы для использования с swift. Тем не менее, вы можете использовать NS ... классы быстро, и я думаю, что эта ситуация оправдывает это. Вот как вы бы это реализовали:
До сих пор (на мой взгляд) это самый простой и эффективный способ доступа к списку рассылки, но в будущем я ожидаю, что Apple добавит больше функциональности (например, использование plist) в родные словари.
источник
Swift - чтение / запись списков и текстовых файлов ....
источник
Swift 2.0: доступ к Info.Plist
У меня есть словарь с именем CoachMarksDictionary с логическим значением в Info.Plist. Я хочу получить доступ к значению bool и сделать это правдой.
Запись в Plist:
Из пользовательского Plist: - (Сделать из File-New-File-Resource-PropertyList. Добавлены три строки с именами: DashBoard_New, DashBoard_Draft, DashBoard_Completed)
Метод можно назвать как
источник
Преобразован в удобное расширение через ответ Ника:
использование:
Я был бы готов поспорить, что это также будет работать для создания аналогичного расширения для массивов
источник
на самом деле может сделать это в 1 строку
источник
Вы можете прочитать plist на языке SWIFT следующим образом:
Считать значение из одного словаря
Если вы хотите получить полный многомерный словарь в plist:
Вот этот лист
источник
Так как этого ответа еще нет, просто хочу отметить, что вы также можете использовать свойство infoDictionary для получения информационного списка в качестве словаря
Bundle.main.infoDictionary
.Хотя что-то подобное
Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String)
может быть быстрее, если вас интересует только конкретный элемент в информационном листе.источник
в моем случае я создаю
NSDictionary
вызываемыйappSettings
и добавляю все необходимые ключи. Для этого случая решение:источник
objectForInfoDictionaryKey
было именно то, что я искал.Вы можете использовать это, я создаю простое расширение для словаря в github https://github.com/DaRkD0G/LoadExtension
И вы можете использовать это для загрузки
источник
Вот немного более короткая версия, основанная на ответе @connor
источник
Swift 3.0
Самый простой способ сделать это, на мой взгляд.
источник
Я создал простой
Dictionary
инициализатор, который заменяетNSDictionary(contentsOfFile: path)
. Просто удалитеNS
.Вы можете использовать это так:
источник
Проанализированный список Swift 4.0 для iOS 11.2.6 и код для его анализа основаны на ответе https://stackoverflow.com/users/3647770/ashok-r выше.
источник
Шаг 1 : Простой и быстрый способ разбора plist в Swift 3+
Шаг 2: Как использовать:
источник
Вот решение, которое я нашел:
Я установил тип
test
на,AnyObject
чтобы заставить замолчать предупреждение о неожиданном выводе, который может произойти.Кроме того, это должно быть сделано в методе класса.
Чтобы получить доступ и сохранить определенное значение известного типа:
источник
Я использую быстрые словари, но конвертирую их в и из NSDictionaries в моем классе файлового менеджера следующим образом:
Это кажется наименее тревожным способом чтения и записи, но остальная часть моего кода останется настолько быстрой, насколько это возможно.
источник
Plist - это простое перечисление Swift, которое я сделал для работы со списками свойств.
Больше примеров:
Plist.swift
Сам по себе Plist довольно прост, вот его список на тот случай, если вы будете ссылаться напрямую.
источник
Swift 3.0
Если вы хотите прочитать «2-мерный массив» из .plist, вы можете попробовать это так:
источник
Простая структура для доступа к файлу plist (Swift 2.0)
Использование:
источник