这里是原文地址 原文链接
本篇是系列的第三篇文章,是关于Struct和Class的。
1. 上期回顾
class ListItem {
var icon: UIImage?
var title: String = ""
var url: NSURL!
static func listItemsFromJSONData(jsonData: NSData?) -> [ListItem] {
guard let nonNilJsonData = jsonData,
let json = try? NSJSONSerialization.JSONObjectWithData(nonNilJsonData, options: []),
let jsonItems = json as? Array<NSDictionary>
else {
return []
}
return jsonItems.flatMap { (itemDesc: NSDictionary) -> ListItem? in
guard let title = itemDesc["title"] as? String,
let urlString = itemDesc["url"] as? String,
let url = NSURL(string: urlString)
else { return nil }
let li = ListItem()
if let icon = itemDesc["icon"] as? String {
li.icon = UIImage(named: icon)
}
li.title = title
li.url = url
return li
}
}
}
对于以上代码,可以用struct代替class,来让我们的代码更像swift。
2. Struct vs Class
在Swift中,结构体更有威力。
- 类 类型是引用类型,是保存一系列数据的载体,可以继承,通过引用传递被复制。
- 而结构体类型是值类型,不能继承,每次传递时候都进行复制。
对于类和结构体的区别,作者推荐去看这篇经典的阐述
3. 将我们这里的类转换为结构体
本例中,结构体更合适。它带有值,并且不打算修改(而不是被引用),所以这是一个有意义的例子。
如果我们没有自定义构造函数,结构体提供默认的构造函数。
因为我们在转化的时候消除了数据的损坏问题。所以,我们可以去掉标题的默认值 " " ,我们可以通过将NSURL! 改为 NSURL来避免可能的crash。
最后,代码如下:
struct ListItem {
var icon: UIImage?
var title: String
var url: NSURL
static func listItemsFromJSONData(jsonData: NSData?) -> [ListItem] {
guard let nonNilJsonData = jsonData,
let json = try? NSJSONSerialization.JSONObjectWithData(nonNilJsonData, options: []),
let jsonItems = json as? Array<NSDictionary> else { return [] }
return jsonItems.flatMap { (itemDesc: NSDictionary) -> ListItem? in
guard let title = itemDesc["title"] as? String,
let urlString = itemDesc["url"] as? String,
let url = NSURL(string: urlString)
else { return nil }
let iconName = itemDesc["icon"] as? String
let icon = UIImage(named: iconName ?? "")
return ListItem(icon: icon, title: title, url: url)
}
}
}
现在,我们在最后一步,通过结构体的默认构造函数来创建实例。
4.总结
这篇主要就是讲,用struct来替换class。
网友评论