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 协议

模式匹配

配合 switch

func descNums(_ num: Int) -> String {
    switch num  {
    case ..<10:
        return "一位数字"
    default:
        return "多位数"
    }
}

descNums(9)

2. Strings

现在String 是集合类型 实现了集合的方法

let string = "1234"
string.count
string.isEmpty

for item in string {
    print(item)
}

String的子字符串的类型现在必须为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的那块内存

unicode

let d: Character = "😝"
type(of: d) //Character


let d1 = "😝"
type(of: d1) //String

Range<String.Index> 和 NSRange 转换

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 计数

//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)

合并

当转化字典的时候可能遇到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]

下标值

aa[3] ?? "55" //3
aa[3, default: "55"] //4

数组分组 划分为 字典

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 标识符

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 为私有属性 当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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,848评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,529评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,824评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,329评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,227评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,879评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,218评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,877评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,159评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,155评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,987评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,736评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,273评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,407评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,663评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,158评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,517评论 2 339

推荐阅读更多精彩内容

  • XCode9新特性1. 支持远程调试2. Xcode绑定Github账号3. 支持Swift类重命名4. Swif...
    乐Coding阅读 3,510评论 3 43
  • 新特性列表1 序列化与反序列化2 String的多行存储3 key-value Coding的优化4 Range单...
    Dreamer_做梦的人阅读 2,722评论 0 52
  • 本篇为 2017 WWDC Session 402 笔记,原视频在这里 语法特性 Swift3中,如果将主体函数的...
    nimomeng阅读 4,281评论 0 18
  • 写在前面 Swift这门语言已经被越来越多的coders接受,大势所趋,尤其作为一个iOS开发者,更需要进行掌握!...
    Cocoaleeo阅读 733评论 0 5
  • 1. extension 里面可以直接访问 private 修饰的成员属性 2. 聚合协议类型? 新的keypat...
    妹子爱编程阅读 1,109评论 0 0