Swift4 -- 新特性

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • XCode9新特性1. 支持遠程調(diào)試2. Xcode綁定Github賬號3. 支持Swift類重命名4. Swif...
    樂Coding閱讀 3,627評論 3 43
  • 新特性列表1 序列化與反序列化2 String的多行存儲3 key-value Coding的優(yōu)化4 Range單...
    Dreamer_做夢的人閱讀 2,833評論 0 52
  • 本篇為 2017 WWDC Session 402 筆記,原視頻在這里 語法特性 Swift3中,如果將主體函數(shù)的...
    nimomeng閱讀 4,372評論 0 18
  • 寫在前面 Swift這門語言已經(jīng)被越來越多的coders接受,大勢所趨,尤其作為一個iOS開發(fā)者,更需要進行掌握!...
    Cocoaleeo閱讀 809評論 0 5
  • 1. extension 里面可以直接訪問 private 修飾的成員屬性 2. 聚合協(xié)議類型? 新的keypat...
    妹子愛編程閱讀 1,178評論 0 0

友情鏈接更多精彩內(nèi)容