只是为了平息我的好奇心,
让我们说,我正在使用XCode在iOS的Objective-C中创建一个项目/框架,我想添加一个方法,该方法将对特定项目进一步可见并隐藏到其他项目中。
如果这不能让你知道我的想法, 让我们说我正在创建一个XCode项目,该项目进一步分为三个不同的项目(比如A,B,C)。当我开始实际实现时,我希望项目A中的所有类方法都可见到项目B,但是希望将它们隐藏在项目C中。
有没有办法在iOS Objective-C / Swift中实现类似的东西?
答案 0 :(得分:1)
我用语言(Objective-c,Swift)开发了自定义框架。事实上,我们不能为一个独特的方法“(public func a(){})”制作不同的范围(公共,私人,受保护)。因此,无论我们在框架内给出任何特定方法的范围,对于那些想要使用它的所有(A,B,C)项目,它都将保持相同。
答案 1 :(得分:1)
正如Mindaugas在其中一条评论中所提到的,你可以为此目的使用类扩展。
类扩展通常用于使用其他私有方法或属性扩展公共接口,以便在类本身的实现中使用。
例如 .h包含
@interface Person : NSObject
@property(nonatomic, copy) NSString *firstName;
@property(nonatomic, copy) NSString *lastName;
- (void)setDateOfBirth:(NSDate *)date;
@end
.m将有
@interface Person()
@property(nonatomic, strong) NSDate *dateOfBirth;
- (void)calculateMyAge;
@end
@implementation Person
- (void)setDateOfBirth:(NSDate *)date
{
self.dateOfBirth = date;
//Some more code goes here
}
- (void)calculateMyAge
{
//Do something with self.dateOfBirth here
}
@end
在这里,我们将@property
dateOfBirth和方法calculateMyAge设为私有接口Person,并在@implementation
块下实现。
@interface Person()
只是类扩展(或无名类别或匿名类别)。
现在回到最初的问题,您希望将其公开给您的框架,并将其公开给外部世界。
让我们假设您希望Person类有一个返回全名的方法(附加名字和姓氏)。但是,您希望用于框架的内部目的。
您可以为此创建单独的头文件。
Person+InternalHeader.h
将声明方法
@interface Person()
- (NSString *)fullName;
@end
您可以导入
#import "Person+InternalHeader.h"
进入Person.m
文件并在@implementation
块下,您可以为该方法实施正文。
@implementation Person
//other code
- (NSString *)fullName
{
return [self.firstName stringByAppendingFormat:@" %@",self.lastName];
}
@end
您始终可以将Person + InternalHeader.h导入到其他类中并使用fullName方法。
为什么要扩展而不是类别?
Extensions使您可以覆盖属性或将新属性添加到现有父类。您也可以始终覆盖子类中扩展中定义的方法的默认行为。使用类别,它只是将方法添加到现有对象。
例如,让我们有从Person类继承的类Doctor。
@interface Doctor : Person
现在您希望fullName
方法返回" Dr。"前缀。您只需覆盖fullName
文件中的Doctor.m
行为即可。
@implementation Doctor
- (NSString *)fullName
{
NSString *fullName = [super fullName];
return [@"Dr. " stringByAppendingString:fullName];
}
@end
答案 2 :(得分:0)
根据项目的含义,您可以有选择地导入标题以影响方法的可见性。
如果Project A有一个实现类方法的类:
@implementation Antelope
+ (void)leap
{
// Jump into the air
}
@end
然后,您可以将该方法的声明放入其自己的标题中的类别中:
// Antelope+Leaping.h
#import "Antelope.h"
@interface Antelope (Leaping)
+ (void)leap;
@end
编译器只允许您在导入该特定标头的文件中编写[Antelope leap]
。当然,项目A对此没有任何控制权:由项目B和C来完成导入。
该方法仍然是该类的成员,并且可以解决编译器,但该方法不会在声明不存在的情况下“可见”。