Swift - Swift4新特性介绍1(Key Paths新语法、类与协议的组合类型) 原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/bl

本文主要是介绍Swift - Swift4新特性介绍1(Key Paths新语法、类与协议的组合类型) 原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/bl,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://www.hangge.com/blog/cache/detail_1823.html

一、Key Paths 新语法

key-path 通常是用在键值编码(KVC)与键值观察(KVO)上的,KVC、KVO 相关内容可以参考我之前写的这篇文章:Swift - 反射(Reflection)的介绍与使用样例(附KVC介绍)

 

1,Swift3 之前使用的是 String 类型的 key-Path

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//用户类

class UserNSObject{

    @objc var name:String ""  //姓名

    @objc var age:Int = 0  //年龄

}

 

//创建一个User实例对象

let user1 = User()

user1.name = "hangge"

user1.age = 100

 

//使用KVC取值

let name = user1.value(forKey: "name")

print(name)

 

//使用KVC赋值

user1.setValue("hangge.com", forKey: "name")

原文:Swift - Swift4新特性介绍1(Key Paths新语法、类与协议的组合类型)

 

2,到了 Swift3 新增了 #keyPath() 写法

使用 #keyPath() 写法,可以避免我们因为拼写错误而引发问题。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//用户类

class UserNSObject{

    @objc var name:String ""  //姓名

    @objc var age:Int = 0  //年龄

}

 

//创建一个User实例对象

let user1 = User()

user1.name = "hangge"

user1.age = 100

 

//使用KVC取值

let name = user1.value(forKeyPath: #keyPath(User.name))

print(name)

 

//使用KVC赋值

user1.setValue("hangge.com", forKeyPath: #keyPath(User.name))

 

3,Swift4 中直接用 \ 作为开头创建 KeyPath

新的方式不仅使用更加简单,而且有如下优点:

  • 类型可以定义为 class、struct
  • 定义类型时无需加上 @objc 等关键字
  • 性能更好
  • 类型安全和类型推断,例如:user1.value(forKeyPath: #keyPath(User.name)) 返回的类型是 Any,user1[keyPath: \User.name] 直接返回 String 类型
  • 可以在所有值类型上使用

 

(1)比如上面的样例在 Swift4 中可以这么写:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//用户类

class UserNSObject{

    var name:String ""  //姓名

    var age:Int = 0  //年龄

}

 

//创建一个User实例对象

let user1 = User()

user1.name = "hangge"

user1.age = 100

 

//使用KVC取值

let name = user1[keyPath: \User.name]

print(name)

 

//使用KVC赋值

user1[keyPath: \User.name] = "hangge.com"


(2)keyPath 定义在外面也是可以的:

1

2

3

4

5

6

let keyPath = \User.name

 

let name = user1[keyPath: keyPath]

print(name)

 

user1[keyPath: keyPath] = "hangge.com"


(3)可以使用 appending 方法向已定义的 Key Path 基础上填加新的 Key Path。

1

2

let keyPath1 = \User.phone

let keyPath2 = keyPath1.appending(path: \.number)

 

二、类与协议的组合类型

在 Swift4 中,可以把类(Class)和协议(Protocol)用 & 组合在一起作为一个类型使用。

 

使用样例1:

1

2

3

4

5

6

7

8

9

10

11

12

13

protocol MyProtocol { }

 

class View { }

 

class ViewSubclassViewMyProtocol { }

 

class MyClass {

    var delegate: (View MyProtocol)?

}

 

let myClass = MyClass()

myClass.delegate = ViewSubclass() //这个编译正常

myClass.delegate = View() //这个编译报错:


具体错误信息如下:

原文:Swift - Swift4新特性介绍1(Key Paths新语法、类与协议的组合类型)

 

使用样例2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

protocol Shakeable {

    func shake()

}

 

extension UIButtonShakeable {

    func shake() {

        /* ... */

    }

}

 

extension UISliderShakeable {

    func shake() {

        /* ... */

    }

}

 

func shakeEm(controls: [UIControl Shakeable]) {

    for control in controls where control.isEnabled {

        control.shake()

    }

}


原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_1823.html

这篇关于Swift - Swift4新特性介绍1(Key Paths新语法、类与协议的组合类型) 原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/bl的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/712608

相关文章

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M