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

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅