Как мне использовать этот fetchRequest () в Swift? - PullRequest
1 голос
/ 01 июля 2019

Я новичок в swift. Я пытаюсь создать базовый класс данных NSManagedObject, как я делал это в Objective-C.

В Objective-C я бы создал что-то вроде

+ (Countries *)countryWithName:(NSString *)name
 inManagedObjectContext:(NSManagedObjectContext *)context {

  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  request.entity = [NSEntityDescription entityForName:NSStringFromClass([self class])
                               inManagedObjectContext:context];


  NSPredicate *predicate = [NSPredicate predicateWithFormat:
                            @"(country == %@)", name];

  request.predicate = predicate;

  return [[context executeFetchRequest:request error:nil] lastObject];
}

Итак, в любое время, когда я хотел бы выбрать страну по названию на основных данных, я бы сделал

userCountry = [Countries countryWithName:@"United States" inManagedObjectContext:self.managedObjectContext];

Но после создания класса NSManagedObject с помощью swift, я вижу, Xcode создал этот код внутри Countries+CoreDataProperties.swift

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

@NSManaged public var number: Int16
@NSManaged public var name: String?
@NSManaged public var shortcut: NSData?

Теперь я хочу создать функцию класса countryByName. Первая строка должна быть

let fetchRequest = NSFetchRequest(entityName: "Countries") 

, но fetchRequest() уже создан.

как мне это использовать?

это не позволит мне использовать

let request = Countries.fetchRequest()

выдает ошибку Ambiguous use of fetchRequest)=

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Вы используете две разные сущности Countries и Atributos в декларации fetchRequest(). Это действительно неоднозначно. Сущность должна быть уникальной.

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

и вы должны использовать его

let fetchRequest : NSFetchRequest<Countries> = Countries.fetchRequest()

Примечание. Настоятельно рекомендуется называть сущности в единственном числе. Семантически каждая запись представляет один Country, а не один Countries. Предполагается, что только ко многим отношениям следует обращаться во множественном числе.

1 голос
/ 01 июля 2019

Запрос на выборку является общим, поэтому вы должны указать тип, например:

let request: NSFetchRequest<Countries> = Countries.fetchRequest()
...