Swift4 基本数据类型(范围型, Stride型, 数组, 字符串, 哈希表)
创建: 2018/02/28
完成: 2018/03/04
更新: 2018/05/03 给主要标题加上英语, 方便页内搜索
【任务表】TODO
范围型(Range)与Stride型 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
与范围运算符相关的型的概要 |
● 有上下限(A..<B, A...B)的叫有界值型 ● 必须采用Comparable(也就是可以比大小) ● 可算类必须采用Collection, 可以一个一个拿出来(for-in) ● 都采用CustomString, 可以直接print输出 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
单侧范围型与范围运算符 |
● 下限范围型可算不可算由T决定 ● 可比较可算的CountablePartialRangeFrom<T>采用了Sequence协议 可以for-in, 由于没有上限, 退出要自己break/return |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
生成范围型实例 |
0 ... 9 // CountableClosedRange<Int> Range<0 ... 9> // Range<Int> 2.5 ..< 4.0 // Range<Double> "a" ... "x" // ClosedRange<String> 16... // CountablePartialRangeFrom<Int> PartialRangeFrom(16) // PartialRangeFrom<Int> ...Float(0.5) // PartialRangeThrough<Float> PartialRangeUpTo(0.5) // PartialRangeUpTo<Double> ● 是构造体 ● 用运算符来生成实例,根据自身值型是否可算来确定类型 可算类型生成CountableRange<T>(A..<B), CountableClosedRange<T>(A...B), CountablePartialRangeFrom<T>(A...) 非可算类型生成非可算范围 ● 可算类范围采用Sequence, 非可算不采用 ● 可以用构造函数来生成(无视被指定型的可算非可算, 可算可变为非可算, 非可算不行!) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
范围型的属性与方法 |
● 属性 T: 有界值型
● 方法
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Stride型概要 |
● 范围和幅度构成的构造体 从范围内以幅度来获取值 ● 构造函数 func stride(from: T, through: T, by: T.stride) -> StrideThrough<T> where T: Strideable // 包含终点 func stride(from: T, to: T, by: T.stride) -> StrideTo<T> where T: Strideable // 不包含终点 例 for x in stride(from: 0, to: 100, by: 2) { ... } ● 常和for-in一起用 ● stride(from:to:by:) 可取范围不包含终点 stride(from:through:by:) 包含 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Stride型与Strideable协议 |
func stride(from: T, through: T, by: T.stride) -> StrideThrough<T> where T: Strideable Stride生成函数返回的型采用Strideable协议 ● Strideable的主要声明 public protocol Strideable: Comparable { associatedtype: Stride: SignedNumeric, Comparable // SignedNumeric: 带符号的数字 func distance(to: Self) -> Self.Stride // 减法, 计算差 func advanced(by: Self.Stride) -> Self // 加法, 返回加上参数的结果 } 差的结果不是Self, 如Stride<UInt>的差为Int (因为有负值) 采用该协议的型主要有: 整数(各种Int), Float, Double, 指针(UnsafePointer<T>) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for-in与Sequence协议 |
采用Sequence或Collection的可用for-in ● Collection继承Sequence ● StrideTo<T>, StrideThrough<T>采用Sequence ● 数组Array构造体, 哈希表Dictionary构造体, 可算双侧范围型CountableRange<T>构造体(A..<B), CountableClosedRange<T>构造体(A...B) String构造体 采用Collection
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
数组(Array) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
数组, 哈希表,字符串, 可算双侧范围型等都是Collection ● 构造体, 值型(只有类的实例与闭包是参照型) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
变更Collection的内容 |
● 两种, 改变自身与返回新值 a.sort() // 改变自身 a.sorted() // 返回新值 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
部分置换 |
a[m...n] = ... ● 元素数不同也行 ● m,n必须是有效值,不能超过范围
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
子数组的型 |
● ArraySlice<T> ● 和原数组的索引一样 ● copy-on-write(所有值型都是) ● 作Array型参数时要型转换Array(subArray) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
数组的构造函数 |
● 类型写法[T], Array[T]. 下面三个一样 var a: [Int] = [1, 2, 3] var b: Array<Int> = Array<Int>(arrayLiteral: 1, 2, 3) var c: Array<Int> = Array<Int>([1, 2, 3]) ● 构造函数
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
数组的属性 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
数组的方法 |
主要方法, 不含带闭包的。采用Collection协议(继承Sequence协议) T: 型参数, S: Sequence, C: Collection, Slice: ArraySlice mutating: 改变受体自身
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
数组的比较 |
● ==, != 比较基准: 元素数相等,对应元素相等 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
有可变长度的参数的函数 |
型名后面三个点... func sample(a: Int, b: String...) -> Bool { ... } ● 与C不同, 不用逗号 ● 任意地方都可以设置成长度变化的参数, 但是一个函数里最多只能有一个可变参数 前提: 可变参数的下一个参数带标签(也就是不能带_) func sample(a: Int..., b: Bool) -> Bool { return false }
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
多元数组 |
数组的元素也是数组 ● 一般最多用到三次元 a[m][n] |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
字符串(String)与字符(Character) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
数组, 哈希表,字符串, 可算双侧范围型等都是Collection ● 构造体, 值型(只有类的实例与闭包是参照型) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
String的构造函数 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Character型 |
可以容纳Unicode字符(包括ASCII字符)一个 ● 没有独自的literal, 生成时用一个字符的字符串 ● 特殊字符\u{}, 如\u{3085} var sample1: Character = "a" // 用字面量来生成 var sample2: Character = "\u{3085}" // 特殊字符 var sample3: Character = Character("a") // 构造函数来生成 ● 采用Comparable, 可比较。 函数参数和运算时可指定一个字符的字符串作为字符型 let a: Character = "a" if a > "b" || a < "x" { ... } ● 可以print |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Unicode.Scalar型 |
表示Unicode字码, 21比特。 let sample1: Unicode.Scalar = "a" let sample2: Unicode.Scalar = "0x83ef" let sample3: Unicode.Scalar = Unicode.Scalar("c")
● Unicode型作为命名空间, 包含字码等型和常数信息 ● 采用Comparable, 可比大小, 可以与一个字符的文字字面量比较 ● 属性 value, 获取字码(UInt32型) ● Character的构造函数可以Unicode.Scalar型实例做参数 ● 可以print |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
合成字符与Character型 |
● Swift的文字都是基于Unicode ● 一个Unicode字符除了单个字码外还有多个字码的组合 let gu: Character = "\u{30B0}" // グ let ku: Character = "\u{30AF}\u{3099}" // ク + ゙ print( gu == ku )
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
从字符串取出字符 |
● 字符串是Character的Collection, 采用Collection String.Element = Character ● for-in, 取出来的型是Character
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
字符串属性 |
主要属性 Ch: Character, Index: String.Index, C: Collection
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
字符串方法 |
主要方法 String采用Collection协议(更准确说是BodorectionalCollection, RangeReplaceableCollection)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
字符串索引 |
subscript(String.Index) -> Character { get } // 获取指定位置的字符
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Foundation框架的功能 |
● 除了算数运算, 系统功能, 还包含ObjC库 ● GUI应用下自动读取 # TODO: Supply [补充Foundation内Swift.String可用的方法 p156] |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
复杂的字符插值 |
● \()插值可以嵌套 ● 内部可以包含式子 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
多行的字符串字面表示方法 literal |
# TODO: Supply [补充该部分 p158] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
作为文字码的Collection来操作字符串 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
哈希表(Hash/Dictionary) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
数组, 哈希表,字符串, 可算双侧范围型等都是Collection ● 构造体, 值型(只有类的实例与闭包是参照型) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
哈希表的型声明与初始值 |
● 所有键必须同型, 所有值必须同型 var sample1 = [ "Swift": 2014, "Objective-C": 1983 ] //字面量来生成 var sample2: [String:Int] = [String, Int]() // 生成空哈希表, 相当于[:] var sample3: [String:Int] = [:] var sample4: Dictionary<String, Int> = Dictionary<String, Int>()//泛型
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
获取哈希表 |
subscript来获取, h["sample"] var sample = ["1":1, "2":2] sample["1"] // -> Int? 这里为1 ● 返回的都是可选型 ● 增加元素 sample["3"] = 3 // 新键里放值 ● 删除元素 sample["1"] = nil // 要删除的地方的值设为nil ● 当key的值必须采用Hashable协议 各种Int, 实例(带误差, 不用), Bool, String, Character等 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
哈希表的比较 |
用==与!= ● 相等含义: 双方键完全相同, 键所对值完全相同 ● 值必须采用Equatable协议 (Comparable协议采用Equatable协议, 所以采用Comparable协议也行) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
哈希表的属性 |
● 附属型 Key: 键型, Keys: Key的Collection Value:值型, Values: Value的Collection associatedtype Element = (key:Key, value:Value) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
哈希表的方法 |
● 不包括带闭包的 ● Keys(键Collection), Values(值Collection)也可用Sequence, Collection的方法 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
哈希表的索引与搜索的默认值 |
哈希表采用Collection subscript(key: Key) -> Value? // 获取值 subscript(Dictionary.Index) -> Element { get } ● 不存在时返回nil ● 设定默认值 subscript(key: Key, default:@autoclosure () -> Value)) -> Value
呼出的写法 h[键, default: 默认值]
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
哈希表与for-in |
基本循环 for h in hashSample { ... } // 基本写法 通配符循环 for (key, value) in hashSample { ... } // key是键, value是值 键/值单个循环 for key in h.keys { ... } // 只要键的Collection for value in h.values { ... } // 只要值的Collection ● 哈希表自身, 键列Keys, 值列Values共用索引 用key去接入哈希表, 值的更换等
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||