Эквивалент Ruby method_missing в Objective C / iOS - PullRequest
10 голосов
/ 21 марта 2012

Насколько я понимаю, Objective C / iOS - очень динамичный язык, так ли он динамичен, как Ruby?У него есть эквивалент method_missing?Я задал тот же вопрос для js Есть ли в Javascript что-то вроде функции method_missing в Ruby? и был разочарован тем, что js пока не поддерживает его.

Ответы [ 3 ]

17 голосов
/ 21 марта 2012

Objective-C является динамическим, хотя, будучи программистом на Ruby, я бы сказал, что он не так динамичен, как Ruby.

Objective-C имеет эквивалент метода method_missing.Вы захотите переопределить forwardInvocation: и methodSignatureForSelector: и последовать этому важному совету Apple:

Важно Чтобы ответить на методы, которые сам объект не распознает,Вы должны переопределить methodSignatureForSelector: в дополнение к forwardInvocation :.Механизм пересылки сообщений использует информацию, полученную из метода methodSignatureForSelector: для создания объекта NSInvocation для пересылки.Ваш переопределяющий метод должен предоставить соответствующую сигнатуру метода для данного селектора, либо предварительно сформировав один, либо запросив другой объект для него.

Не используйте doesNotRecognizeSelector:, поскольку Apple предупреждает, что it must always result in an exception being thrown.

Более подробную информацию см. В документации по классу NSObject: http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

0 голосов
/ 29 октября 2013

Я реализовал этот шаблон на основе примера добавления тех же методов в подкласс UITextField и UITextView: https://stackoverflow.com/a/19661059/171933

Наслаждайтесь!

0 голосов
/ 21 марта 2012

Я полагаю, что method_missing - это метод обратного вызова, который вызывается, когда в объекте отсутствует определенный метод.Ну, вы можете использовать метод RespondsToSelector, чтобы проверить, может ли объект ответить на метод.Это метод, объявленный в протоколе NSObject.Таким образом, вместо вызова метода method_missing после осознания того, что какой-то метод отсутствует, вы можете проверить его заранее.

 if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)])
    NSLog(@"The method is missing");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...