Как написать действительно динамические методы в Objective-C?
Я только начал разрабатывать эту библиотеку
Его главная цель - позволить программисту писать имена методов, например предложения, для работы с Core Data.
Примеры:
[moc RD_createUserWithName:@"John" age:@29 married:@YES];
[moc RD_createCompanyWithName:@"Yandex, LLC" ceo:me managers:@[firstManager, secondManager]];
[moc RD_createCompanyWithName:@"Google" ceos:@[larryPage, sergeyBrin] manager:jonathanGreen];
[moc RD_createBookWithAuthor:joanneRowling name:@"Harry Potter" publishedAt:[NSDate date]];
[moc RD_createTaskForProject:googleTalk priority:@3 members:nil];
[moc RD_createArticleAboutUser:alizar withName:@"Alizar - Habrahabr Soul" andTitle:@"Alizar"];
или поиск предметов:
NSArray* mos = [moc RD_findUsersWithFirstName:@"Igori"];
NSManagedObject* mo = [moc RD_findUserWithLastName:@"Guliko" firstName:@"Igori"];
NSArray* mos = [moc RD_findBooksPublishedAt:[NSDate date]];
NSArray* mos = [moc RD_findFriendsLastSeenAt:[NSDate date]];
NSArray* mos = [moc RD_findBooksPublishedAfter:[NSDate date]];
NSArray* mos = [moc RD_findBooksPublishedBefore:[NSDate date]];
NSManagedObject* mo = [moc RD_findStudentCreatedBefore:[NSDate date] emailLike:@"*@gmail.com"];
NSArray* mos = [moc RD_findCompaniesRegisteredAfter:[NSDate date] limit:@10 offset:@1];
NSArray* mos = [moc RD_findClientsAddedBetween:@[startDate, endDate]];
NSArray* mos = [moc RD_findStudentsWithAgeBetween:@[@18, @28]]; // plural
NSManagedObject *mo = [moc RD_findStudentWithAgeBetween:@[@18, @28]]; // singular
NSArray* mos = [moc RD_findUsersWithGender:@[@"Male", @"Female"] lastNameLike:@"*ir*" ageBetween:@[@18, @29]];
NSArray* mos = [moc RD_findCarsWithFuelVolumeGreaterThan:@10];
NSArray* mos = [moc RD_findMessagesWithPositiveVotesSmallerThan:@29];
Но я не могу заставить его работать без отключения ARC. (Предыдущий Q: Ошибка компиляции с ARC при динамическом методе программирования во время выполнения).
Из списка рассылки:
Наши рассуждения были разделены примерно на 50/50 между (1) необходимостью быть более осторожным в отношении типов и собственности и (2) желанием устранить смущающую бородавку в языке (не позволять жаловаться на совершенно неизвестные методы чем-то более напряженным, чем предупреждение). На самом деле нет законной причины для вызова метода, который даже не объявлен где-то. Возможность сделать это делает некоторые действительно тривиальные ошибки (например, опечатки в селекторах) сбоями во время выполнения вместо ошибок компиляции. Мы всегда предупреждали об этом. Исправьте ваш код.
Итак, Objective-C больше не является реальным Objective-C с динамическими методами?
Возможно ли сейчас реализовать то, что я хотел в RubyDavidson или нет?
1 ответ
Используя динамические методы, вы должны решить две проблемы: существование во время выполнения, которое кажется решенным, и существование для компилятора. "Нет" - неправильный ответ на ваш вопрос, потому что вы можете решить эту проблему.
Для этого есть две техники:
А. Поместите их в категорию класса получателя. Тогда у вас есть декларация. Используй это. Это называется неформальным протоколом. Используется в какао с самого начала.
Б. Поместите их в протокол и сделайте его необязательным. Тогда у вас есть декларация. Используй это. Это называется формальным протоколом.