你将如何在Swift中实现以下模式?
所述Container类被初始化,其中包含的词典JSON数组.这些词典用于初始化Entry类.但是,Entry当访问entries或searchEntries访问属性时,对象的初始化会延迟发生.
@interface Container
@property (readonly, nonatomic) NSArray *entryDicts;
@property (readonly, nonatomic) NSArray* entries;
@property (readonly, nonatomic) NSDictionary *searchEntries;
@end
@implementation Container
- (instancetype)initWithArray:(NSArray *)array
{
self = [super init];
if (self) {
_entryDicts = array;
}
return self;
}
@synthesize entries = _entries;
- (NSArray *)entries
{
[self loadEntriesIfNeeded];
return _entries;
}
@synthesize entriesByNumber = _entriesByNumber;
- (NSDictionary *)entriesByNumber
{
[self loadEntriesIfNeeded];
return _entriesByNumber;
}
- (void)loadEntriesIfNeeded
{
if (_entries == nil) {
// Load entries
NSMutableArray *entries = [NSMutableArray arrayWithCapacity:[self.entriesDict count]];
NSMutableDictionary *entriesByNumber = [NSMutableDictionary dictionaryWithCapacity:[self.entriesDict count]];
[self.entriesDict enumerateKeysAndObjectsUsingBlock:^(NSString *number, NSDictionary *entryDict, BOOL *stop) {
Entry *entry = [[Entry alloc] initWithDictionary:entryDict container:self];
[entries addObject:entry];
entriesByNumber[number] = entry;
}];
_entries = [entries copy];
_entriesByNumber = [entriesByNumber copy];
// Delete dictionaries
_entriesDict = nil;
}
}
@end
Run Code Online (Sandbox Code Playgroud)
那这个呢:
class Container {
lazy var entries: [String] = self.newEntries()
func newEntries() -> [String] {
// calculate and return entries
}
}
Run Code Online (Sandbox Code Playgroud)
似乎这个问题已经在很大程度上得到了回答,但是回到最初的帖子,这里(恕我直言)是一个相对简洁的Swift翻译.关键是你可以链接惰性属性.请注意,我同时使用了类函数和闭包 - 两者都没问题.
import Swift
println("begin")
class ClassWithLazyProperties {
lazy var entries:[String] = ClassWithLazyProperties.loadStuff()
lazy var entriesByNumber:Dictionary<Int, String> = {
var d = Dictionary<Int, String>()
for i in 0..<self.entries.count {
d[i] = self.entries[i]
}
return d
}()
private class func loadStuff() -> [String] {
return ["Acai", "Apples", "Apricots", "Avocado", "Ackee", "Bananas", "Bilberries"]
}
}
let c = ClassWithLazyProperties()
c.entriesByNumber
// 0: "Acai", 1: "Apples", 2: "Apricots", 3: "Avocado", 4: "Ackee", 5: "Bananas", 6: "Bilberries"]
println("end")
Run Code Online (Sandbox Code Playgroud)
您可以使用optional作为实例变量.然后创建一个函数,如果它存在则返回可选项,如果不模拟延迟加载则创建一个新对象.
class Lazy {
var lazyVariable:String?
func lazilyGetEntries() -> String {
if let possibleVariable = self.lazyVariable { // optional already exists
return possibleVariable
}
else { // optional does not exist, create it
self.lazyVariable = String()
return self.lazyVariable!
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12842 次 |
| 最近记录: |