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

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python