Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 编写一个对一个项目可见而对另一个项目隐藏的类方法?_Ios_Objective C_Swift_Xcode - Fatal编程技术网

Ios 编写一个对一个项目可见而对另一个项目隐藏的类方法?

Ios 编写一个对一个项目可见而对另一个项目隐藏的类方法?,ios,objective-c,swift,xcode,Ios,Objective C,Swift,Xcode,只是为了平息我的好奇心 比方说,我正在用Objective-C为iOS使用XCode创建一个项目/框架,我想添加一个方法,该方法将进一步对特定项目可见,而对其他项目隐藏 如果这不能让你了解我的想法, 假设我正在创建一个XCode项目,它被进一步划分为三个不同的项目(比如a、B、C)。当我开始实际实现时,我希望项目A中的所有类方法对项目B可见,但希望对项目C隐藏它们 在iOS Objective-C/Swift中有没有这样的实现方法?我用两种语言(Objective-C,Swift)开发了自定义框

只是为了平息我的好奇心

比方说,我正在用Objective-C为iOS使用XCode创建一个项目/框架,我想添加一个方法,该方法将进一步对特定项目可见,而对其他项目隐藏

如果这不能让你了解我的想法, 假设我正在创建一个XCode项目,它被进一步划分为三个不同的项目(比如a、B、C)。当我开始实际实现时,我希望项目A中的所有类方法对项目B可见,但希望对项目C隐藏它们


在iOS Objective-C/Swift中有没有这样的实现方法?

我用两种语言(Objective-C,Swift)开发了自定义框架。这是一个事实,我们不能为唯一的方法(public func a(){})创建不同的作用域(public、private、protected)。因此,无论我们在框架内给出任何特定方法的范围是什么,对于所有(A,B,C)想要使用它的项目,它都将保持不变。

根据您所指的项目,您可以有选择地导入标题以影响方法的可见性

如果项目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进行导入


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

正如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私有化给接口人员,并在
@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方法

为什么是扩展而不是类别?

扩展使您能够重写该属性或向现有父类添加新属性。此外,您还可以在子类中重写扩展中定义的方法的默认行为。使用category,它只是将方法添加到现有对象中

例如,让我们有一个从类人继承的类医生

@interface Doctor : Person
现在您希望
fullName
方法返回前面的“Dr.”。您可以简单地覆盖
Doctor.m
文件中的
fullName
行为

@implementation Doctor
- (NSString *)fullName
{
    NSString *fullName = [super fullName];
    return [@"Dr. " stringByAppendingString:fullName];
}
@end

我用这两种语言(Objective-c、Swift)开发了自定义框架。这是一个事实,我们不能为一个唯一的方法创建不同的作用域(公共、私有、受保护)。我想你可以使用扩展,例如,像这里这样的东西。是的,扩展将为你工作。我一直认为这有点奇怪。我一直认为可见性不应该是语言的一部分,而应该是环境的一部分。你应该能够生成任何你想要的“标题”,而不仅仅是一个。我似乎还记得Dylan那样做过,所以对于相同的代码,您可以有一个内部仅供使用的标题和一个公共标题。我们正在项目a中创建Antelope类,所以这里我们坚持基于项目的方法,但问题与“n个项目(a、B、C..n)的基于框架的方法范围和访问范围有关”我认为这是不可能的。完美的答案。解释一切。谢谢