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

相关文章

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

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.