【发布时间】:2014-06-14 16:15:53
【问题描述】:
我已成功将以下方法从Obj-C转换为Swift:
在了解了blocks are replaced by closures 如何在 Swift 中使用之后。
Obj-C:
- (RACSignal *)fetchCurrentConditionsForLocation:(CLLocationCoordinate2D)coordinate {
NSString *urlString = [NSString stringWithFormat:@"http://api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&units=imperial", coordinate.latitude, coordinate.longitude];
NSURL *url = [NSURL URLWithString:urlString];
return [[self fetchJSONFromURL:url] map:^(NSDictionary *json) {
return [MTLJSONAdapter modelOfClass:[WXCondition class] fromJSONDictionary:json error:nil];
}];
}
斯威夫特:
func fetchCurrentConditionsForLocation(coordinate: CLLocationCoordinate2D) -> RACSignal {
let urlString = NSString(format: "http://api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&units=metric", coordinate.latitude, coordinate.longitude)
let url = NSURL.URLWithString(urlString)
return fetchJSONFromURL(url).map { json in
return MTLJSONAdapter.modelOfClass(WXCondition.self, fromJSONDictionary: json as NSDictionary, error: nil)
}
}
但是,我在将以下返回映射块转换为 Swift 时遇到了问题:
func fetchHourlyForecastForLocation(coordinate: CLLocationCoordinate2D) -> RACSignal {
var urlString = NSString(format: "http://api.openweathermap.org/data/2.5/forecast?lat=%f&lon=%f&units=metric&cnt=12", coordinate.latitude, coordinate.longitude)
let url = NSURL.URLWithString(urlString)
/* Original Obj-C:
return [[self fetchJSONFromURL:url] map:^(NSDictionary *json) {
RACSequence *list = [json[@"list"] rac_sequence];
return [[list map:^(NSDictionary *item) {
return [MTLJSONAdapter modelOfClass:[WXCondition class] fromJSONDictionary:item error:nil];
}] array];
}];
}
*/
// My attempt at conversion to Swift
// (I can't resolve `rac_sequence` properly). Kind of confused
// as to how to cast it properly and return
// it as an "rac_sequence" array.
return fetchJSONFromURL(url).map { json in
let list = RACSequence()
list = [json["list"] rac_sequence]
return (list).map { item in {
return MTLJSONAdapter.modelOfClass(WXCondition.self, fromJSONDictionary: item as NSDictionary, error: nil)
} as NSArray
}
}
如果有帮助,rac_sequence 就是这样:
- (RACSequence *)rac_sequence {
return [RACArraySequence sequenceWithArray:self offset:0];
}
RACArraySequence():
+ (instancetype)sequenceWithArray:(NSArray *)array offset:(NSUInteger)offset;
编辑: fetch 方法返回 RACSignal 而不是 NSArray:
func fetchJSONFromURL(url: NSURL) -> RACSignal {
}
【问题讨论】:
-
多好的问题!一个快速的评论是始终使用初始化语法。
NSURL(string:urlString)而不是NSURL.urlWithString。您将它用于NSString,但没有用于NSURL:p -
@JackWu:感谢您的建议!欣赏它!使用初始化语法更好的任何特殊原因?
-
在 Swift 中,这是进行初始化的唯一方法。不再有类初始化器与实例初始化器。 ObjC 初始化器和工厂方法都会自动转换为这种新语法。它的未来!
-
@JackWu:有道理,谢谢。
标签: objective-c closures objective-c-blocks swift reactive-cocoa