Objective-C:从另一个 class 调用方法的语法
Objective-C: Syntax to call method from another class
iOS newb 试图从另一个 class 中提取一个数组,但出现错误。从根本上说,我并不真正理解方法和属性之间的区别,我意识到,所以这可能有助于我更好地理解它。
我创建了一个 returns 数组的方法。我想在另一个 class 中使用该数组(就像在其他语言中返回一个值的函数)所以我想我会按如下方式进行:
class1
- (id) getTags{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Tags"];
fetchRequest.resultType = NSDictionaryResultType;
NSError *error = nil;
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest
error:&error];
NSMutableArray * tags = [[results valueForKey:@"tag"] mutableCopy];
return tags;
}
换句话说,我想将该方法 returns 用作一种变量,在 Objective C 中称为属性。该方法也在 .h 文件中,因此它是 public.
在 class 2 中,我在顶部导入 class 1,然后尝试按如下方式调用方法:
NSArray *newarray = [class1 getTags];
但是我得到错误 "No known class method for selector getTags"
谁能告诉我我做错了什么?
谢谢。
我怀疑这条线;
NSArray *newarray = [class1 getTags];
实际上,您应该使用 class 实例,而不是 class 本身。
要使用这种函数调用,您应该将 getTags 声明为 class 级别的函数(+函数),而不是 - function
所以你的代码应该是这样的;
class1 *class1Instance = [[class1 alloc] init];
NSArray *newarray = [class1Instance getTags];
代码有问题NSArray *newarray = [class1 getTags];
您正在 class1
中调用 class 方法 getTags
;但是你在 class1
.
中只有一个名为 getTags
的实例方法
要解决它,将方法签名中的 - 更改为 +,这会将您的方法从实例方法更改为 class 方法。 (在 java 术语中:+ 是您在方法中放置静态变量的位置)。
但是,您的代码中存在很多样式问题。
首先,我认为将代码放在 .h 中不是一个好的做法。你可能想要的是
.h
@interface Class1
+ (NSArray *)getTags;
@end
.m
@implementation Class1
+ (NSArray *)getTags { ... }
@end
所以你在 .h 文件中声明你的 public 接口并在 .m 中实现。此外,您可能希望将您的 class 名称大写。
您不应将 id
用作 return 类型并将 id
从 [class1 getTags]
分配给 NSArray *
。那里有一个隐式转换,有时可能会导致一些很好的调试时间。
NSArray
可以用作方法的 return 类型,因为 NSMutableArray
继承自 NSArray
- Apple Documentation of NSMutableArray
iOS newb 试图从另一个 class 中提取一个数组,但出现错误。从根本上说,我并不真正理解方法和属性之间的区别,我意识到,所以这可能有助于我更好地理解它。
我创建了一个 returns 数组的方法。我想在另一个 class 中使用该数组(就像在其他语言中返回一个值的函数)所以我想我会按如下方式进行:
class1
- (id) getTags{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Tags"];
fetchRequest.resultType = NSDictionaryResultType;
NSError *error = nil;
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest
error:&error];
NSMutableArray * tags = [[results valueForKey:@"tag"] mutableCopy];
return tags;
}
换句话说,我想将该方法 returns 用作一种变量,在 Objective C 中称为属性。该方法也在 .h 文件中,因此它是 public.
在 class 2 中,我在顶部导入 class 1,然后尝试按如下方式调用方法:
NSArray *newarray = [class1 getTags];
但是我得到错误 "No known class method for selector getTags"
谁能告诉我我做错了什么?
谢谢。
我怀疑这条线;
NSArray *newarray = [class1 getTags];
实际上,您应该使用 class 实例,而不是 class 本身。 要使用这种函数调用,您应该将 getTags 声明为 class 级别的函数(+函数),而不是 - function
所以你的代码应该是这样的;
class1 *class1Instance = [[class1 alloc] init];
NSArray *newarray = [class1Instance getTags];
代码有问题NSArray *newarray = [class1 getTags];
您正在 class1
中调用 class 方法 getTags
;但是你在 class1
.
getTags
的实例方法
要解决它,将方法签名中的 - 更改为 +,这会将您的方法从实例方法更改为 class 方法。 (在 java 术语中:+ 是您在方法中放置静态变量的位置)。
但是,您的代码中存在很多样式问题。 首先,我认为将代码放在 .h 中不是一个好的做法。你可能想要的是
.h
@interface Class1
+ (NSArray *)getTags;
@end
.m
@implementation Class1
+ (NSArray *)getTags { ... }
@end
所以你在 .h 文件中声明你的 public 接口并在 .m 中实现。此外,您可能希望将您的 class 名称大写。
您不应将 id
用作 return 类型并将 id
从 [class1 getTags]
分配给 NSArray *
。那里有一个隐式转换,有时可能会导致一些很好的调试时间。
NSArray
可以用作方法的 return 类型,因为 NSMutableArray
继承自 NSArray
- Apple Documentation of NSMutableArray