Як я можу записати функцію, яка буде приймати як параметр UIView або UIButton.
Наприклад, скажімо, що я хотів закруглити кути Перегляду / Кнопки:
[self roundCorners:x]
Як я можу зробити так, щоб прийняти як об'єкт UIButton, так і об’єкт UIView як x?
Першими моїми думками було використання id або NSObject, але я не думаю, що це правильно:
-(void)roundCorners:(id)objectToRound;
Вибачте за запитання новачка; Я все ще зависаю цього. Дякую!
Відповіді:
8 для відповіді № 1UIButton
є підкласом UIView
, тож ваш метод візьме або один, якщо ви заявите це таким чином:
- (void)roundCorners:(UIView *)objectToRound;
1 для відповіді № 2
Коротка відповідь:
if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (UIButton *) view;
// do something funky with button
} else {
// do something funky with view
}
Детальна відповідь:
Перш за все, це зазвичай найкраще мати конкретний метод для обробки кожного класуоб’єкт. Це так, що ви можете змусити компілятор вирішити, що потенційно передає неправильний клас методу. Однак є випадки, коли це не підходить або неможливо.
У кінцевому рахунку UIView та UIButton є нащадком NSObject.
NSObject має метод isKindOfClass:
яку ви можете використовувати для визначення того, з чим маєте справу. Я зробив це на крок далі, визначивши кілька допоміжних макросів, які спрощують подібні завдання, які часом є досить трудомісткими.
Якщо ви подивіться на мою відповідь це питання... ви побачите вихідний код і приклад використання цих макросів. Я часто використовую один з таких макросів (asClass
), що поєднує в собі a isKindOfClass:
тест, пов’язаний з типом, поданим для класу, на який тестується.
Ви можете кодувати таку річ довгою рукою, проте я вважаю, що вона створює більш читабельний код для використання asClass
макрос. Простіше кажучи asClass(myView,UIButton)
буде вирішено до нуля або до посилання на тип myView як UIButton - якщо це не UIButton, він буде вирішений до нуля.
Я змінив фрагмент з цієї публікації, щоб відповідати вашому питанню:
- (void)myMethod:(UIView*)view{
UIButton *button = asClass(view, UIButton);
if (button) {
// do something funky with button
} else {
// do something funky with view
}
}
Для кодування цієї довгої руки (без макросів) це виглядало б приблизно подобається це:
- (void)myMethod:(UIView*)view{
if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (UIButton *) view;
// do something funky with button
} else {
// do something funky with view
}
}
Як бачите, це зайвий код не надто багатозробіть це довгою рукою, і якщо вам не зручно використовувати макроси для подібних речей (деякі люди не потрібні), то ви можете вибрати другий приклад.
якщо вам подобаються макроси і бачите достоїнства підходу, який я застосував, розгляньте цей третій спосіб виконання:
- (void)myMethod:(UIView*)view{
UIButton *button;
if ( (button = asClass(view, UIButton)) ) {
// do something funky with button
} else {
// do something funky with view
}
}
Я сподіваюсь, це допоможе.
Якщо вам подобається ця відповідь, будь ласка, проголосуйте її. Якщо ти хочеш відповідь на моє оригінальне запитання де живе код, проголосуйте також :-)
0 для відповіді № 3
Те, як ви це зробите, має працювати добре, id
прийму майже все.