2012-01-30 2 views
0

У меня есть метод, который должен принимать double и id.Объективный метод c, который принимает типы id и double?

Я не могу просто обернуть двойной в обертке NSNumber из-за обратной совместимости.
Как бы я определил свой метод, чтобы принять как double, так и id?

- (void) addBothDoublesAndIds: (id, double) doubleOrObject; 

Так выше в скобках только то, что я бы как принять, синтаксис только для демонстрации.

+0

Я в замешательстве .. вы говорите, что хотите один единственный метод, который принимает либо 'id', либо' double'? –

+4

двойной или объект? почему не два отдельных метода? Кроме того, я не могу понять, почему вы не можете использовать 'NSNumber', так как это объект, который может обернуть' double's .. –

+4

Как это для обратной совместимости, поскольку метод не мог воспользоваться этой опцией раньше? – Mark

ответ

1

Вы можете написать:

- (void)addDouble:(double)aDouble andObject:(id)anObject; 

, если он должен быть либо-либо (не может точно сказать, из ОП), а затем рассмотреть отдельные методы, или выше метод с некоторыми средствами отличить ли параметром для использования является double или id (например, если anObject - nil, то используется значение double).

Как правило, вы придерживаетесь «одного параметра + несколько методов» в этом случае. Объект, который содержит информацию, может быть другим (более ясным) решением для этого.

2

Одним словом, вы не можете. Аргументы должны быть только одного типа. Что предлагает Джастин, это одно решение, или вы можете определить два метода.

Фактически, каждый селектор - каждое имя метода - должен иметь одинаковую аргументацию во всех объявлениях и реализациях. Есть места, где это правило нарушается в различных рамках, и это вызывает боль.

2

Во многих случаях вы также просите проблему, приняв также id.

Напишите два метода и попросите их обернуть другой.

- (void) addDouble: (double) aDouble { 
[self addNumber:[NSNumber numberWithDouble:aDouble]]; 
} 

- (void) addNumber: (NSNumber *) aNumber { 
// do stuff with your number 
} 

Время выполнения отправит ваше сообщение правильному, и у вас есть проверка типа saner для загрузки.

Смежные вопросы