Где бы я поместил глобальную функцию полезности в Objective C?
При написании приложения iOS, где бы я разместил функцию, которую я намерен использовать из любого другого файла?
Например, функция преобразования NSDate в относительную временную строку ( "5 секунд назад" ).
Могу ли я создать класс и сделать все эти функции статическими?
Ответы
Ответ 1
Функции могут быть размещены везде, где это удобно. Если функция или группа функций могут быть импортированы во многих местах, вы можете объявить и реализовать их в своей собственной паре .h/.m. Например, вы можете реализовать свою функцию преобразования даты в файле с именем XYZDateUtilities.m и объявить ее в XYZDateUtilities.h.
Объявление функций с помощью определителя static
ограничивает их область действия файлом, в котором они были объявлены, поэтому вы не захотите этого делать; на самом деле вы хотели бы сделать обратное - объявите их как extern
в файле .h, чтобы они были видны в других файлах.
Ответ 2
У вас есть несколько вариантов:
1) Если вы расширяете поведение класса (например, метод преобразования строки NSDate, который вы описали), он может работать лучше всего, чтобы просто создать категорию в указанном классе.
Вот учебник по категориям iOS:
http://mobile.tutsplus.com/tutorials/iphone/objective-c-categories/
Важное примечание:
Категории изменяют поведение класса (если вы переопределяете метод) везде внутри проекта, включите ли вы заголовок (.h) в другой определенный класс импорта
По этой причине обычно лучше не переопределять методы через категорию, а вместо этого создавать подкласс, если вы хотите изменить определенные методы.
Однако для добавления новых методов категории могут быть очень удобными и полезными.
2) Если вы хотите создать новый класс, который был импортирован повсюду, вы можете создать указанный класс и поместить его заголовок, т.е. #import "MyClass.h"
, в ваш проект prefix.pch
файл (найденный в группе "поддерживающие файлы" в пределах проект по умолчанию).
Все, что вы помещаете в файл prefix.pch
, будет доступно в любом месте вашего приложения. Это также полезно для размещения констант (например, строк) или определения перечислений, которые используются во многих классах в приложении.
Надеюсь, это поможет. Дайте мне знать, если потребуется дополнительное разъяснение, и я сделаю все возможное, чтобы помочь.
Ура!
Ответ 3
Другой вариант - создать класс для ваших вспомогательных методов и реализовать все помощники как методы класса.
например. HelperClass.h
+ (NSString *)getFrenchCapital
например. HelperClass.m
+ (NSString *)getFrenchCapital
{
return @"Paris";
}
Затем импортируйте свой вспомогательный класс везде, где он вам нужен, и просто вызовите методы класса:
например. Foo.m
#import "HelperClass.h"
...
- (void)logFrenchCapital
{
NSLog(@"Capital of France: %@", [HelperClass getFrenchCapital]);
}
Ответ 4
Если вы ставите все функции в классе, альтернатива - это просто определить функции в файле .m и extern-функции в файле .h, как и то, что вы делаете на C.