Thinking in Swift 系列文章翻译3

2018-04-11  本文已影响8人  你weixiao的时候很美

这里是原文地址 原文链接

本篇是系列的第三篇文章,是关于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。

上一篇 下一篇

猜你喜欢

热点阅读