Как написать действительно динамические методы в 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 ответ

Используя динамические методы, вы должны решить две проблемы: существование во время выполнения, которое кажется решенным, и существование для компилятора. "Нет" - неправильный ответ на ваш вопрос, потому что вы можете решить эту проблему.

Для этого есть две техники:

А. Поместите их в категорию класса получателя. Тогда у вас есть декларация. Используй это. Это называется неформальным протоколом. Используется в какао с самого начала.

Б. Поместите их в протокол и сделайте его необязательным. Тогда у вас есть декларация. Используй это. Это называется формальным протоколом.

Другие вопросы по тегам