写一个类方法对一个项目可见并隐藏在其他项目中?

时间:2017-01-27 13:19:38

标签: ios objective-c swift xcode

只是为了平息我的好奇心,

让我们说,我正在使用XCode在iOS的Objective-C中创建一个项目/框架,我想添加一个方法,该方法将对特定项目进一步可见并隐藏到其他项目中。

如果这不能让你知道我的想法, 让我们说我正在创建一个XCode项目,该项目进一步分为三个不同的项目(比如A,B,C)。当我开始实际实现时,我希望项目A中的所有类方法都可见到项目B,但是希望将它们隐藏在项目C中。

有没有办法在iOS Objective-C / Swift中实现类似的东西?

3 个答案:

答案 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来完成导入。

该方法仍然是该类的成员,并且可以解决编译器,但该方法不会在声明不存在的情况下“可见”。