Swift 4新功能-4

八、泛型下标

下标现在可以有泛型参数和返回类型.
最权威的例子莫过于表示 JSON 数据: 你可以定义一个泛型下标来保持调用者期望类型的内容.

struct JSON {
    fileprivate var storage: [String:Any]

    init(dictionary: [String:Any]) {
        self.storage = dictionary
    }

    subscript<T>(key: String) -> T? {
        return storage[key] as? T
    }
}

let json = JSON(dictionary: [
    "城市名": "北京",
    "国家代码": "cn",
    "人口": 21_710_000
    ])

// 没必要用 as? Int
let population: Int? = json["人口"]

另一个例子: Collection 的一个下标接受一个泛型索引序列, 并返回一个这些索引所在的数组:

extension Collection {
    subscript<Indices: Sequence>(indices: Indices) -> [Element] where Indices.Element == Index {
        var result: [Element] = []
        for index in indices {
            result.append(self[index])
        }
        return result
    }
}

let words = "我 思 故 我 在".split(separator: " ")
words[[1,2]]

九、NSNumber 桥接

修正部分危险行为当桥接Swift原生数字类型和NSNumber的时候.

import Foundation

let n = NSNumber(value: UInt32(301))
let v = n as? Int8 // nil(Swift 4). Swift 3会是45 (试试看!).

十、类和协议的组合

你现在能写出OC这段 UIViewController <SomeProtocol> * 在Swift中的等价代码, 比如声明这样一个变量,这个变量拥有实体类型并同时遵守若干协议. 语法 let 变量: 某个类 & 协议1 & 协议2.

import Cocoa

protocol HeaderView {}

class ViewController: NSViewController {
    let header: NSView & HeaderView

    init(header: NSView & HeaderView) {
        self.header = header
        super.init(nibName: nil, bundle: nil)
    }

    required init(coder decoder: NSCoder) {
        fatalError("not implemented")
    }
}

// 不能传一个简单的NSView进去因为不遵守协议
//ViewController(header: NSView())
// 错误: argument type 'NSView' does not conform to     expected type 'NSView & HeaderView'

// 必须穿一个 NSView (子类) 同时遵守协议
extension NSImageView: HeaderView {}

ViewController(header: NSImageView()) // 有用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 136.泛型 泛型代码让你可以写出灵活,可重用的函数和类型,它们可以使用任何类型,受你定义的需求的约束。你可以写出...
    无沣阅读 1,544评论 0 4
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,923评论 1 10
  • 2016年10月12日 Objective-C id为Swift Any Swift 3接口与Objective-...
    魔灵FH阅读 2,893评论 0 19
  • 53.计算字符 在字符串中获取字符值的数量, 可以使用字符串字符属性中的计数属性: let unusualMena...
    无沣阅读 1,151评论 0 4
  • 朝歌降,云雾邪。几经风雨,雨上榆烟翠。离筝秦音南望北,古道多香,辗转几折回。 苏烟起,故旧常。频频几见,醉久夜望香...
    李高翰阅读 360评论 0 0