Я занимаюсь дженериками в Свифт. У меня есть расширение до класса NSManagedObject
и вы хотите создать инициализатор, который доступен только для классов, которые реализуют определенный мной протокол. Теперь у меня есть что-то вроде ниже, но это не работает и даже не компилируется. Не могли бы вы помочь мне заставить его работать?Как создать универсальный инициализатор удобства в Swift?
public extension NSManagedObject {
public convenience init<Self: Nameable>(context: NSManagedObjectContext) {
let entity = NSEntityDescription.entityForName(Self.entityName(), inManagedObjectContext: context)!
self.init(entity: entity, insertIntoManagedObjectContext: context)
}
}
public protocol Nameable {
static func entityName() -> String
}
Xcode говорит: «Общий признак« Я »не используется в сигнатуре функции».
Поскольку вы ничего не сделали, чтобы принять Именимый, неясно, что вы даже пытаетесь сделать здесь. Кажется, у него нет цели. - Также, как это общее решение будет разрешено? - Кроме того, «Я» имеет значение, поэтому вы не должны злоупотреблять им как имя заполнителя. – matt
У меня есть другие подклассы 'NSManagedObject' и пытаюсь сделать их доступными для' let obj = MyClass (context: context) ', но только если они реализуют' Nameable'.Я вижу, что это неверное объявление и должно быть больше похоже: 'extension NSManagedObject, где NSManagedObject: Nameable', но он также не работает таким образом. –
Но вы не можете остановить экземпляр от вызова 'let obj = MyClass (context: context)' на основе того, что это за класс! Это не имеет никакого смысла, на любом языке. Если есть инициализатор 'MyClass (контекст: контекст)', _anyone_ может вызывать его (если они видят его). Это характер объектно-ориентированного программирования, если вы понимаете, что я имею в виду. Я также не вижу причин, по которым вы хотели бы это сделать. – matt