Objective-C结构数组

Lor*_*olt 5 arrays struct vector objective-c

我想要一个像下面这样的结构:

struct foo {
NSString Title;
NSInteger numberOfBooks;
vector of NSStrings Books;
};

foo bar[50];
Run Code Online (Sandbox Code Playgroud)

首先,我想知道如何创建一个字符串数组(每行包含一个书名).

然后我想知道我写的代码是否正确.

最后,我可以使用bar [n] .Title访问结构的所述元素吗?


我按照你评论的内容,以及它的外观:

@interface Foo : NSObject {
NSString *name;
NSArray *books;
}

@end

A->name = @"Clancy, Thomas";
A->books = [[NSArray alloc] initWithObjects:@"Book 1"
            @"Book2",nil];
self.authors = [[NSArray alloc] initWithObjects:A, nil];
Run Code Online (Sandbox Code Playgroud)

现在它给了我实例变量'name'受保护.我尝试写公开:在定义Foo时,但它不接受.(是的,我是Obj-C的新手).

adr*_*usi 7

遗憾的是,启用了自动引用计数(ARC)的Objective C不允许C结构内的对象.Objc也只允许NSArrays中的对象(向量的松散等价物).

解决方案的第一步是创建一个类而不是一个struct:

// Foo.h
#import <Foundation/Foundation.h>

@interface Foo : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSArray *books;
// no need to keep the number of items in an NSArray as a separate variable,
// NSArray does that for you.

- (id)initWithTitle:(NSString *)title books:(NSArray *)books;

@end

// Foo.m
#import "Foo.h"

@implementation Foo
@synthesize title;
@synthesize books;

- (id)initWithTitle:(NSString *)title books:(NSArray *)books
{
  if (self = [super init]) {
    self.title = title;
    self.books = books;
  }
  return self;
}

@end
Run Code Online (Sandbox Code Playgroud)

请注意,所有对象类型都是指针.这是因为objc中的所有对象都是堆分配的,因此您不能对不是指针的对象进行对象.另请注意,该类型NSArray未参数化.那是因为objc没有泛型模板的概念,所以数组的内容可以是任何对象.这通常不是问题,但偶尔会在编译时捕获类型错误.

保持这些Foo对象的数组很简单.你可以把它们做成一个C数组Foo *bar[50];,但我不认为它适用于ARC,它绝对不是在目标c中做到这一点的正确方法.正确的方法是使用另一个NSArray:NSArray *bar = [[NSArray alloc] init];或使用objc2.0语法:NSArray *bar = @[];

一些可能对你有帮助的笔记

@property并且@synthesize是用于为if创建实例变量和访问器方法的快捷方式.如果要从类外部(或更确切地说,实现文件)访问实例变量,则需要访问器方法.该strong标志告诉引用计数器这是一个强引用,如c ++ boost库中的shared_ptr.我不知道是什么nonatomic,但我告诉你需要它.

该方法initWithTitle:books:类似于构造函数,除了objc没有构造函数的概念.该实现调用超类的构造函数self = [super init](假设self是对象的c ++引用).构造函数可以返回nil,这就是为什么你需要if块.

该行在self.title = title;技术上是简写[self setTitle:title];,它使用由@property和自动生成的方法@synthesize.