1. 單邊 ranges
//ranges
let nums = ["1","2","3"]
//swift3
nums[0...2]
//swift4
nums[0...]
無限序列
var a = 1...
print(a.contains(100000))
這里的a 的類型 CountablePartialRangeForm 遵循 RangeExpression 協(xié)議
模式匹配
配合 switch
func descNums(_ num: Int) -> String {
switch num {
case ..<10:
return "一位數(shù)字"
default:
return "多位數(shù)"
}
}
descNums(9)
2. Strings
現(xiàn)在String 是集合類型 實現(xiàn)了集合的方法
let string = "1234"
string.count
string.isEmpty
for item in string {
print(item)
}
String的子字符串的類型現(xiàn)在必須為String.index 或者Range<String.index> 以前可以為Int
string[string.startIndex..<string.endIndex]
string.prefix(3)
string.prefix(upTo: string.endIndex)
let b = string[string.startIndex..<string.endIndex]
type(of: b) // Substring.type
let c = String(b)
type(of: c) // String.type
截取的substring 指向的是原版本string的那塊內(nèi)存
unicode
let d: Character = "??"
type(of: d) //Character
let d1 = "??"
type(of: d1) //String
Range<String.Index> 和 NSRange 轉(zhuǎn)換
NSRegularExpression, NSAttributedString, NSLinguisticTagger api 需要NSRange
Foundation 提供新的初始化方法
// Rnage -> NSRange
let aa = "a124??"
let range = NSRange(aa.startIndex..., in: aa) //region Range<String.index>
aa.utf16.count // 6
aa.count // 5
這里NSRange 是 已utf-16 計數(shù)
//NSRange -> Range
let text = "You have traveled 483.2 miles."
let pattern = "[0-9]+(\\.([0-9])?)?"
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let nsrange = NSRange(text.startIndex..., in: text)
let mile = regex.rangeOfFirstMatch(in: text, options: [], range: nsrange)
let range1 = Range(mile, in: text)
print(range1)
text[range1!] //483.2
多行字符串
let multiString = """
AAA
bbb
ccc
"""
3 字典增強功能
基于序列初始化字典
let array = ["1","2","3"]
//[1:"1",2:"2",3:"3"]
let dic = Dictionary.init(uniqueKeysWithValues: zip(1..., array))
let tupleArray = [(1,"1"),(2,"2")]
let dic2 = Dictionary.init(uniqueKeysWithValues: tupleArray)
合并
當(dāng)轉(zhuǎn)化字典的時候可能遇到key 沖突
可以確定第一個 或者 最后一個 解決沖突
let pairsWithDuplicateKeys = [("a", 1), ("b", 2), ("a", 3), ("b", 4)]
let firstValues = Dictionary(pairsWithDuplicateKeys,
uniquingKeysWith: { (first, _) in first })
// ["b": 2, "a": 1]
let lastValues = Dictionary(pairsWithDuplicateKeys,
uniquingKeysWith: { (_, last) in last })
// ["b": 4, "a": 3]
let defaultStyling: [String: UIColor] = [
"body": .black, "title": .blue, "byline": .green
]
var userStyling: [String: UIColor] = [
"body": .purple, "title": .blue
]
userStyling.merge(defaultStyling) { (user, _) -> UIColor in
user
}
// ["body": .purple, "title": .blue, "byline": .green]
下標(biāo)值
aa[3] ?? "55" //3
aa[3, default: "55"] //4
數(shù)組分組 劃分為 字典
let aa = [1,2,3,4,-1]
let dic = Dictionary.init(grouping: aa) { (key) -> String in
if(key > 0) {
return "1"
}else {
return "-1"
}
}
//["1": [1, 2, 3, 4], "-1": [-1]]
4 @objc 和 @nonobjc
在swift 4 重寫 和 繼承 都會
繼承@objc 標(biāo)識符
class Super {
@objc func foo() {}
}
class Sub: Super {
// inferred @objc
override func foo() {}
}
@objc protocol MyDelegate {
func bar()
}
class MyThirdClass: MyDelegate {
// inferred @objc
func bar() {}
}
其他
extension 中的privite
以前聲明privite 為私有屬性 當(dāng)extension擴展需要私有屬性的時候
用fileprivite聲明
swift4 privite 默認同文件中 extension 也可以獲取到私有屬性
swapAt
var numbers = Array(1...5)
//swap(&numbers[1], &numbers[3]) // Illegal in Swift 4
numbers.swapAt(1, 3)
// [1, 4, 3, 2, 5]
swift4 可以指定對象遵循特定的類型和屬性
protocol MySpecialDelegateProtocol {}
class MySpecialView: UIView {}
class MyController {
var delegate: (UIView & MySpecialDelegateProtocol)?
}
簡化
public typealias Codable = Decodable & Encodable
遷移swift4
選擇
Edit\Convert\To Current Swift Syntax...
因為swift3的@objc 推斷模式和 4 不一樣
這里需要選擇

image.png
選擇推薦的方式
最后

image.png