2016-06-06 2 views
1

Что было бы эквивалентом расширений в Objective-C, как в Swift? Это то же самое, что создать класс класса внутри класса?Объектив C Расширение, эквивалентное Swift Extensions?

extension CGRect{ 
     static func rectWithTwoPoints(p1:CGPoint,p2:CGPoint) -> CGRect 
     { 
      return CGRectMake(min(p1.x, p2.x),min(p1.y, p2.y),fabs(p1.x - p2.x),fabs(p1.y - p2.y)); 
     } 
    } 

ответ

1

в объективном с его category и скор ее extension

1.Click File -> New -> File 2.Select Objective-C файл под Sources в прошивке или Mac OS, соответственно, и нажмите кнопку Далее 3.Now выберите тип файла, как Category

Выберите UIView в качестве BaseClass из category и установить имя как «UIView + CGRect»

И вы можете добавить свои методы как

UIView + CGRect.h категории:

+ (CGRect) rectWithTwoPoints:(CGPoint) p1 andWith:(CGPoint) p2; 

UIView + CGRect.m категории:

+ (CGRect) rectWithTwoPoints:(CGPoint) p1 andWith:(CGPoint) p2 { 
    return CGRectMake(MIN(p1.x, p2.x), MIN(p1.y, p2.y), fabs(p1.x - p2.x), fabs(p1.y - p2.y)); 
} 

И просто импортировать в категорию просмотра контроллера, где вы хотите его использовать и доступ как

В ViewController.h

#import "UIView+CGRect.h" 

И код будет

CGrect rect = [UIView rectWithTwoPoints:POINT_ONE andWith:rectWithTwoPoints:POINT_TWO]; 

Вы получите желаемый результат.

1

Не существует единого эквивалента, это разные языки с различными возможностями.

Для вашего примера «эквивалент» будет объявлять где-то полезную функцию, скорее всего, только в файле, потому что CGRect не является классом. Это была бы функция C, а не метод Obj-C.

Вы даже можете объявить макрос для него.

1

В объектно-C структурах не похож на классы, а простые C. Поэтому у них нет связанных с ними функций. Обычная модель состоит в том, что существуют (C) функции, связанные со структурой. Вы найдете a bunch of them в заголовках, например:

CGRect CGRectMake (CGFloat x, CGFloat y, CGFloat width, CGFloat height); 

Если вы хотите иметь дополнительную функцию, просто напишите:

CGRect rectWithTwoPoints(CGPoint p1, CGPoint p2) 
{ 
    return CGRectMake(min(p1.x, p2.x),min(p1.y, p2.y),fabs(p1.x - p2.x),fabs(p1.y - p2.y)); 
} 

И поставить прототип в заголовок, если вы хотите использовать его вне определяющего модуля компиляции:

CGRect rectWithTwoPoints(CGPoint p1, CGPoint p2); // <- There is a semicolon for prototyping