У моего сегментированного средства выбора есть обычные значения Int в виде тегов. Как это передается в CoreData? - PullRequest
0 голосов
/ 15 октября 2019

Я только начинаю, поэтому извиняюсь, если это глупый вопрос.

Так или иначе ... мой выборочный элемент управления SwiftUI использует простые значения Int ".tag (1)" и т. Д. Для своего выбора. Coredata имеет на выбор только варианты Int16, Int32 и Int64, и с любым из этих вариантов, кажется, мой выбор и Coredata отказываются общаться друг с другом.

Как эта (?? простая ??) задача достигается, пожалуйста?

Я пробовал каждый числовой вариант в CoreData, включая Int16-64, double и float, все они ломают моюкод или просто не работает.

Picker(selection: $addDogVM.gender, label: Text("Gender?")) {
                        Text("Boy ♂").tag(1)
                        Text("?").tag(2)
                        Text("Girl ♀").tag(3)

Я ожидал, что любой из 3 вариантов CoreData Int будет работать "из коробки" и будет совместим с (стандартным) Int, используемым сборщиком.

1 Ответ

0 голосов
/ 20 октября 2019

Каждый элемент сегментированного элемента управления представлен индексом типа Int, и поэтому этот индекс начинается с 0.

Итак, используя ваш пример сегментированного элемента управления с тремя сегментами (например,: Boy ♂,?, Girl ♀), каждый сегмент представлен тремя индексами 0, 1 и 2.

Если пользователь выбирает сегментированный элемент управления, представляющий Girl ♀, то ...

segmentedControl.selectedSegmentIndex = 2

При сохранении значения с использованием инфраструктуры базовых данных, которая должна быть представлена ​​в пользовательском интерфейсе как сегментированный контрольный индекс, поэтому я всегда начинаю с 0.

Все, что вы читаете из этогоСуть в том, что предпочтение программиста - то есть, и это должно быть понятно - есть несколько способов достичь того же результата, и вы должны выбрать тот, который лучше всего подходит вам и вашему стилю кодирования. Заметьте также, что это может сбить с толку новичка, поэтому я бы поощрял терпение. Мой единственный совет: будьте как можно проще, пока вы не протестируете, не отладите и не протестируете достаточно, чтобы понять различия.

Итак, продолжим:

Документация Apple утверждает, что ...

... на 64-разрядных платформах, размер Int такого же размера, как Int64.

То же самое в редакторе модели Core Data (файл .xcdatamodeld)Я решил применить тип атрибута Integer 64 для любого значения, которое будет использоваться в моем коде как Int.

Кроме того, где-то, некоторое время назад, я читал, что если нет причин использовать Integer 16 или Integer 32, то по умолчанию используется Integer 64 в графе объектной модели. (Я предполагаю, что Integer 16 или Integer 32 сохранены для обратной совместимости.) Если я найду эту ссылку, я свяжу ее здесь.

Я мог бы написать об использовании скалярных типов атрибутов здесь и вручную написать подклассы управляемого объекта, выбрав в инспекторе атрибутов Class Codegen = Manual / None, но, честно говоря, я решил, что такая добавленная деталь только усложнитимеет значение.

Таким образом, ваш подкласс (ы) управляемых объектов "автоматически сгенерированный Core Data" (NSManagedObject) будет использовать необязательную оболочку NSNumber? ...

Поэтому вам нужно будет преобразоватьВаши сохраненные / сохраненные данные в вашем коде.

Я делаю это в двух местах ... когда я получаю доступ к данным и когда я сохраняю данные.

(отмечая, что я предполагаю, что ваша сущность имеет тип Dog и существует экземпляр dog, то есть let dog = Dog())

// access
tempGender = dog.gender as? Int

// save
dog.gender = tempGender as NSNumber?

Между ними я использую "temp" var свойство типа Int для работы с сегментированным элементом управления.

// temporary property to use with segmented control
private var tempGender: Int?

Любые вопросы задавайте в комментариях.

...