小编Mat*_*ewS的帖子

如何使用swift flatMap从数组中过滤掉选项

我对flatMap有点困惑(添加到Swift 1.2)

假设我有一些可选类型的数组,例如

let possibles:[Int?] = [nil, 1, 2, 3, nil, nil, 4, 5]
Run Code Online (Sandbox Code Playgroud)

在Swift 1.1中,我会做一个过滤器,然后是这样的地图:

let filtermap = possibles.filter({ return $0 != nil }).map({ return $0! })
// filtermap = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

我一直尝试使用flatMap这样做:

var flatmap1 = possibles.flatMap({
    return $0 == nil ? [] : [$0!]
})
Run Code Online (Sandbox Code Playgroud)

var flatmap2:[Int] = possibles.flatMap({
    if let exercise = $0 { return [exercise] }
    return []
})
Run Code Online (Sandbox Code Playgroud)

我更喜欢最后一种方法(因为我不必强制解包$0!...我害怕这些并且不惜一切代价避免它们)除了我需要指定数组类型.

是否有一个替代方法可以根据上下文计算出类型,但是没有强制解包?

functional-programming optional higher-order-functions flatmap swift

22
推荐指数
2
解决办法
1万
查看次数

使用KVO与NSNotificationCenter观察对可变阵列的更改

在我的模型中,我有一个名为events的对象数组.我希望每当将新对象添加到事件时都会通知我的控制器.

我认为这样做的一个好方法是使用KVO模式在事件发生变化时收到通知(来自添加的新对象)

// AppDelegate
// events is a NSMutableArray @property/@synthesize etc...

[appDelagate addObserver:self
               forKeyPath:@"events"
                  options:NSKeyValueObservingOptionNew
                  context:NULL];
Run Code Online (Sandbox Code Playgroud)

但是没有调用observeValueForKeyPath方法,我发现Arrays不符合KVO :-(

一种选择是通过为keyPath 调用willChangeValueForKey来手动触发该方法

// ViewController
[self willChangeValueForKey:@"events"];
[self.events addObject:event];
[self didChangeValueForKey:@"events"];
Run Code Online (Sandbox Code Playgroud)

但是这感觉很重,因为我应该跟踪事件数组的前后状态,以便可以从observeValueForKeyPath方法访问它.

一种方法可能是使用标准数组(而不是可变)并在每次我想要添加新对象时创建/设置新的事件实例,或者我可以创建一个单独的属性来跟踪有多少项在可变数组(我希望你能观察到@"events.count").

另一种选择是使用NSNotificationCenter.我还读了一些建议使用块的答案(但我不知道从哪里开始).

最后,我可以在我的代理中保留我的控制器实例并发送相关消息吗?

// Delegate
[myController eventsDidChange];
Run Code Online (Sandbox Code Playgroud)

从代表那里保持对控制器的引用是不是很奇怪?

我很难理解如何选择最佳使用方法,因此对性能,未来代码灵活性和最佳实践的任何建议都非常感谢!

model-view-controller delegates key-value-observing nsnotificationcenter ios

19
推荐指数
1
解决办法
2万
查看次数