转自:http://www.cocoachina.com/swift/20160613/16632.html
@H_403_2@ 原文:Thinking in Swift,Part 1: Saving ponies,原博客地址:Crunchy Developmen,译者:ray16897188 @H_403_2@ 我常看见Swift的新手试着将它们的ObjC代码翻译成Swift。但是开始用Swift写代码的时候最难的事情并不是语法,而是思维方式的转变,去用那些ObjC里并没有的Swift新概念。 @H_403_2@ 在这一系列的文章中,我们会拿一个ObjC代码做例子,然后在把它转成Swift代码的全程中引入越来越多的对新概念的讲解。 @H_403_2@ 本文的第一部分内容:可选类型(optionals),对可选类型的强制拆包,小马,if let,guard和??。 @H_403_2@ ObjC代码 @H_403_2@ 假设你想创建一个条目列表(比如过会儿要显示在一个TableView里)- 每个条目都有一个图标,标题和网址 - 这些条目都通过一个JSON初始化。下面是ObjC代码看起来的样子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@interfaceListItem:NSObject
@property(strong)UIImage*icon;
@property(strong)NSString*title;
@property(strong)NSURL*url;
@end
@implementationListItem
+(NSArray*)listItemsFromJSONData:(NSData*)jsonData{
NSArray*itemsDescriptors=[NSJSONSerializationJSONObjectWithData:jsonDataoptions:0error:nil];
NSMutableArray*items=[NSMutableArray
new
];
for
(NSDictionary*itemDesc
in
itemsDescriptors){
ListItem*item=[ListItem
];
item.icon=[UIImageimageNamed:itemDesc[@
"icon"
]];
item.title=itemDesc[@
"title"
];
item.url=[NSURLURLWithString:itemDesc[@
]];
[itemsaddObject:item];
}
return
[itemscopy];
}
@end
|
classListItem{
var
icon:UIImage?
title:String=
""
url:NSURL!
staticfunclistItemsFromJSONData(jsonData:NSData?)->NSArray{
letjsonItems:NSArray=
try
!NSJSONSerialization.JSONObjectWithData(jsonData!,options:[])as!NSArray
letitems:NSMutableArray=NSMutableArray()
itemDesc
jsonItems{
letitem:ListItem=ListItem()
item.icon=UIImage(named:itemDesc[
]as!String)
item.title=itemDesc[
]as!String
item.url=NSURL(string:itemDesc[
"url"
]as!String)!
items.addObject(item)
}
items.copy()as!NSArray
}
}
|
使用可选绑定(optional binding)if let x = optional { /* 使用 x */ }
用as?替换掉as!,前者在转型失败的时候返回nil;你当然可以把它和if let结合使用
你也可以用try?替换掉try!,前者在表达式失败时返回nil1。
if
letnonNilJsonData=jsonData{
letjsonItems:NSArray=(
?NSJSONSerialization.JSONObjectWithData(nonNilJsonData,options:[]))as?NSArray{
letitems:NSMutableArray=NSMutableArray()
jsonItems{
letitem:ListItem=ListItem()
leticon=itemDesc[
]as?String{
item.icon=UIImage(named:icon)
}
lettitle=itemDesc[
]as?String{
item.title=title
leturlString=itemDesc[
]as?String{
leturl=NSURL(string:urlString){
item.url=url
}
}
items.addObject(item)
}
items.copy()as!NSArray
}
}
[]
//IncasesomethingFailedabove
}
判决的金字塔
@H_403_2@ 可悲的是,满世界的添加这些if let让我们的代码往右挪了好多,形成了臭名昭著的判决金字塔(此处插段悲情音乐)。
@H_403_2@ Swift中有些机制能帮我们做简化:
@H_528_301@
|