Ошибка, делающая отношения сущности кодируемыми / декодируемыми - PullRequest
0 голосов
/ 07 июня 2018

Как кодировать / декодировать переменную NSOrderedSet в swift4, кодируемую при отображении coredata NSManagedObject?

import CoreData
import Foundation

@objc(TestObject)
public class TestObject:NSManagedObject,Encodable
{

@nonobjc public class func fetchRequest() -> NSFetchRequest<TestObject> {
    return NSFetchRequest<TestObject>(entityName: "TestObject")
}


@NSManaged public var testName: String?
@NSManaged public var devices: NSOrderedSet?  // of entity type "Device"

enum CodingKeys: String, CodingKey {
    case testName
    case devices

}
public func encode(to encoder: Encoder) throws {
     var container = encoder.container(keyedBy:CodingKeys.self)
    try container.encode(testName,forKey:.testName)
    try container.encode(devices,forKey:.devices)
}
}

public required convenience init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
    try container.decode(testName,forKey:.testName)
    try container.decode(devices,forKey:.devices)

}

Выдает ошибку: Компилятор выдает эту ошибку

No 'decode' candidates produce the expected contextual result type 'NSOrderedSet?'

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы можете сделать это, воспользовавшись одним из автоматически созданных средств доступа.

//addToDevices(_ value: Device) 

public required convenience init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    self.testName = try container.decode(String.self, forKey: .testName)
    let devices = try container.decode([Device].self, forKey:.devices)
    devices.forEach { self.addToDevices($0) }
}

Если у вас нет автоматически созданных средств доступа, выполните следующие действия

  1. Выберите ваш файл модели данных проекта
  2. Выберите «Редактор» 7-й слева от Apple в строке меню
  3. Выберите «Создать подкласс NSManagedObject
  4. Установите флажок рядомк модели данных
  5. Установите флажки для сущностей, которые вы хотите использовать
  6. Выберите «Создать»
0 голосов
/ 08 июня 2018

Это потому, что NSOrderedSet не поддерживает Codable протокол.Вместо этого попробуйте использовать Set.

@NSManaged public var devices: Set<String>? 

. Вы можете создать Set типов данных независимо от того, что поддерживает ваше приложение.

...