在 Objective-C 中,您最好使用 NSDictionaries 或自定义对象而不是结构。扩展 H2CO3 的评论 - 你可以声明一个 BookCollection 类
BookCollection.h
#import <Foundation/Foundation.h>
@interface BookCollection: NSObject
@property (nonatomic, strong) NSString* title
@property (nonatomic, strong) NSArray* books
//use NSArray* for a static array or NSMutableArray* for a dynamic array
@end
BookCollection.m
#import "BookCollection/BookCollection.h"
@implementation BookCollection
@end
您的实现是空的,因为您的对象只有公共属性而没有自定义方法。我们使用@property 语法来声明我们的实例变量,因为这带来了许多优点,例如内置的 getter 和 setter。(详情请看我的回答)
与 C++ 不同,您可以在集合类中混合对象类型,因此如果您添加标题、书籍和其他书籍集合,您的 books 数组不会抱怨:您的代码应确保一致性。我们不声明数组大小。对于静态 NSArray,大小是在创建时隐含的,对于动态 NSMutableArray,没有固定限制。对于 50 本书的集合,创建一个包含 50 个预先存在的集合的 NSArray。或者创建一个 NSMutableArray ,您可以逐步添加它。
BookCollection* joyce = [[BookCollection alloc] init];
joyce.title = @"Books by James Joyce";
joyce.books = @["Ulysses",@"Finnegan's Wake"]; //using static NSArray
BookCollection* tolkein = [[BookCollection alloc] init];
tolkein.title = @"Books by J.R.R. Tolkein";
[tolkein.books addObject:@"The Hobbit"]; //using dynamic NSMutableArray
[tolkein.books addObject:@"Lord of the Rings"];
对于集合的动态数组:
NSMutableArray* collections = [[NSMutableArray alloc] init];
[collections addObject:joyce];
[collections addObject:tolkein];
对于固定数组,您可以使用文字语法:
NSArray* collections = @[joyce, tolkein];
对于 numberOfBooks,只需使用count
数组的属性
int numberOfBooks = joyce.books.count;
如果要确保使用标题和书籍创建集合,请按照 adrusi 的回答使用自定义初始化程序。这不是使对象工作所必需的,但如果您想保证您的对象有内容,它会很有用。
要访问实例变量,请使用[message syntax]
(原始 obj-C 方式)或dot.syntax
(与 @properties 一起使用)
[tolkein books]
joyce.books
不要使用->
箭头语法。有关详细说明,请参见此处。