美文网首页
Thinking in Swift 系列文章翻译3

Thinking in Swift 系列文章翻译3

作者: 你weixiao的时候很美 | 来源:发表于2018-04-11 23:24 被阅读8次

这里是原文地址 原文链接

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

相关文章

网友评论

      本文标题:Thinking in Swift 系列文章翻译3

      本文链接:https://www.haomeiwen.com/subject/tnxtkftx.html