当谈到在Swift中改变值类型时,有些事情我并不完全理解.
正如"The Swift Programming Language"iBook所述: 默认情况下,不能在其实例方法中修改值类型的属性.
因此,为了实现这一点,我们可以mutating
在结构和枚举中使用关键字声明方法.
对我来说并不完全清楚的是:您可以从结构外部更改var,但不能从自己的方法中更改它.这对我来说似乎是违反直觉的,因为在面向对象语言中,你通常会尝试封装变量,因此它们只能从内部进行更改.对于结构,这似乎是另一种方式.详细说明,这是一段代码片段:
struct Point {
var x = 0, y = 0
mutating func moveToX(x: Int, andY y:Int) { //Needs to be a mutating method in order to work
self.x = x
self.y = y
}
}
var p = Point(x: 1, y: 2)
p.x = 3 //Works from outside the struct!
p.moveToX(5, andY: 5)
Run Code Online (Sandbox Code Playgroud)
有没有人知道结构不能从他们自己的上下文中改变他们的内容的原因,而内容可以很容易地在其他地方改变?
我们使用ReactiveCocoa 2.5在我们的应用程序中重复出现,难以重现崩溃
我们有一个后台调度程序,我们在应用程序的实时时间保留.每当我们进行网络呼叫(使用AFNetworking)时,我们都会在此后台调度程序上提供结果(大多数时候是JSON数据).然后,我们将数据存储在后台核心数据上下文中,最终在原始调度程序(实际上是主调度程序)上完成.
代码中此流程的一个示例:
- (RACSignal *)example {
NSString *path = _applicationConfiguration.competitionsPath;
@weakify(self)
RACSignal *networkCallSignal = [[RACSignal createSignal:^RACDisposable *(id <RACSubscriber> subscriber) {
@strongify(self)
NSURLSessionDataTask *task = [self _GETDataTaskWithSubscriber:subscriber path:path parameters:nil];
return [RACDisposable disposableWithBlock:^{
[task cancel];
}];
}] deliverOn:_backgroundScheduler];
RACSignal *networkCallSignalToCoreDataSaveSignal = [[networkCallSignal flattenMap:^RACStream *(id result) {
@strongify(self)
NSError *error;
Team *team = [self _saveJSONToCoreData:result error:&error];
if (team) {
return [RACSignal return:team.identifier];
} else {
return [RACSignal error:error];
}
}] subscribeOn:_backgroundScheduler];
return [networkCallSignalToCoreDataSaveSignal deliverOn:[RACScheduler currentScheduler]];
}
- (Team *)_saveJSONToCoreData:(NSDictionary *)JSONData error:(NSError …
Run Code Online (Sandbox Code Playgroud)