首页 > 其他分享 >盘点 swift 中 where 关键字的所有用法,你知道多少?

盘点 swift 中 where 关键字的所有用法,你知道多少?

时间:2023-12-15 18:44:56浏览次数:35  
标签:swift number 关键字 let numbers func print where

盘点 swift 中 where 关键字的所有用法,你知道多少?

盘点 swift 中 where 关键字的所有用法,你知道多少?

杂雾无尘 杂雾无尘 博观而约取,厚积而薄发  

关注我,每天分享一个关于 iOS 的新知识

 

 

 

前言

where 是 Swift 中一个强大的关键字,可以轻松过滤掉一些值。它可以用于许多不同的表达式中,今天就来盘点一下。

在 switch 中使用

在 switch 语句中的 case 中,可以用 where 关键字做二次筛选,举个例子:

let point = (x: 3, y: 4)

switch point {
case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}

在这个示例中,我们有一个点的坐标点 (x, y)。在 switch 的 case 中,我们使用了 where 子句来判断点是否在 x == y 这条直线上,或是在 x == -y 这条直线上。

如果不满足 where 子句的条件,就会执行默认的 case 分支。

最后的输出为:(3, 4) is just some arbitrary point

在 for 循环中的使用

在 for 循环中,也可以使用 where 子句来添加条件判断:

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for number in numbers where number % 2 == 0 {
    print(number)
}

// 输出:
// 2
// 4
// 6
// 8
// 10

在这个例子中,我们遍历数字数组,但只打印出能被 2 整除的偶数。

在协议扩展中的用法

我们都知道,在 swift 中可以通过为协议添加扩展 (protocol extension) 来实现协议的默认实现。此时可以在扩展的 where 子句中添加约束:

protocol Shape {
    func draw()
}

extension Shape where Self: Equilateral {
    func draw() {
        // 绘制等边形
    }
}

extension Shape where Self: Rectangle {
    func draw() {
        // 绘制矩形
    }
}

struct Square: Shape, Equilateral { }

let square = Square()
square.draw() // 绘制等边形

我们为 Shape 协议添加了两个扩展,其中为 Equilateral 和 Rectangle 添加了 draw 方法的默认实现。

在扩展的 where 子句中指定了 Self 的约束类型。然后 Square 结构体实现了 Shape 和 Equilateral 协议,此时会调用 Equilateral 的 draw 实现。

通过 where 子句,可以根据协议扩展的指定类型进行有条件的默认实现,使协议扩展更加灵活。

各种高阶函数中的用法

1、查找满足条件的第一个元素

let numbers = [1, 2, 3, 4, 5]
let number = numbers.first(where: { $0 > 2 })
print(number!) // 输出: 3

2、查找满足条件的最后一个元素

let numbers = [1, 2, 3, 4, 5]
let number = numbers.last(where: { $0 > 2 })
print(number!) // 输出: 5

3、判断是否包含满足条件的元素

let numbers = [1, 2, 3, 4, 5]
let isContains = numbers.contains(where: { $0 > 2 })
print(isContains) // 输出: true

4、查找满足条件的第一个元素的下标

let numbers = [1, 2, 3, 4, 5]
let index = numbers.firstIndex(where: { $0 > 2 })
print(index!) // 输出: 2

5、查找满足条件的最后一个元素的下标

let numbers = [1, 2, 3, 4, 5]
let index = numbers.lastIndex(where: { $0 > 2 })
print(index!) // 输出: 4

6、将数组按条件拆分

let numbers = [1, 2, 3, 4, 5]
let array = numbers.split(whereSeparator: { $0 > 3 || $0 < 2 } )
print(array) // 输出: [ArraySlice([2, 3])]

在泛型函数中的用法

可以用 where 关键字向泛型参数添加约束:

protocol Printable {
    func print()
}

func printBoth<P1: Printable, P2: Printable>(_ p1: P1, _ p2: P2) where P1 == P2 {
    p1.print()
    p2.print()
}

在协议声明中的使用

在协议的声明中,可以为关联类型 (associatedtype) 的类型增加约束:

protocol Stack {
  associatedtype Element where Element: CustomStringConvertible
  mutating func push (_ element: Element)
  mutating func pop () -> Element?
}

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

标签:swift,number,关键字,let,numbers,func,print,where
From: https://www.cnblogs.com/sexintercourse/p/17904003.html

相关文章

  • 关键字 开发-12 yaml文件实现参数化
    前言说到接口自动化,那肯定少不了参数化,这也是pytest的一个特色之一,相比与unitest实现起来更加方便好用。实验参数化常见的就是使用@pytest.mark.parametrize在测试函数或类中定义多组参数,在用例中实现参数化。#参数化方式一[email protected]("test_in......
  • Python 异步编程之yield关键字
    背景介绍在前面的篇章中介绍了同步和异步在IO上的对比,从本篇开始探究python中异步的实现方法和原理。python协程的发展流程:python2.5为生成器引用.send()、.throw()、.close()方法python3.3为引入yieldfrom,可以接收返回值,可以使用yieldfrom定义协程Python3.4加入了asy......
  • 线性探测法的查找函数 整型关键字的散列映射
    一、 实验目的掌握哈希表二、  实验内容实验题目线性探测法的查找函数整型关键字的散列映射  三、   设计文档 1.   2.   四、   源程序  1. PositionFind(HashTableH,ElementTypeKey){    intflag=0;    Positionp......
  • 整型关键字的散列映射
    #include<iostream>#include<vector>#define_CRT_SECURE_NO_WARNINGS1usingnamespacestd;intmain(){intn,p;//scanf("%d%d",&n,&p);cin>>n>>p;vector<int>a(p,-1);while(n--){intx;......
  • Swift —— 一、架构解析
    一、简介OpenStack对象存储(swift)用于冗余、可扩展的数据使用标准化服务器集群存储PB的存储可访问的数据。它是一种长期存储系统,可存储大量可以检索和更新的静态数据。对象存储使用分布式架构没有中央控制点,提供更大的可扩展性,冗余和持久性。对象写入多个硬件设备,使用Ope......
  • yield关键字和生成器
    yield关键字和生成器【1】列表元组生成式num_list=[i**2foriinrange(10)]#[0,1,4,9,16,25,36,49,64,81]【2】yield关键字defgenerator():yield1yield2yield3generator=generator()print(next(generator))defeat():print('开始......
  • explicit关键字
    1.隐式类型转换在C++11前,对于类的使用,存在隐式类型转化的情况,实质上是构造函数的隐式调用。下面是一个例子:EG:代码:#include<iostream>usingnamespacestd;classTest{public:intx;inty;Test(intx=1,inty=2):x(x),y(y){cout<<"parameter......
  • Angular Component 内 set 关键字的使用
    "set"关键字在Angular组件的TypeScript代码中通常用于创建和定义类的属性的setter方法。它是一种特殊的方法,负责设置类的私有成员变量的值。通过使用"set"关键字,我们可以在设置属性值时执行一些额外的逻辑,如输入验证、触发事件等。让我们通过一个简单的例子来说明"set"关键字的用......
  • Sam Altman当选“TIME时代周刊”2023年度最佳CEO!还有梅西、Taylor Swift当选...
    TIME时代周刊昨日在官网公布了2023年最佳CEO——SamAltman当选!此外,TaylorSwift当选年度最佳人物,梅西当选年度最佳运动员。SamAltman的当选可谓是实至名归!没有谁能比火爆全球的ChatGPT背后,OpenAI的CEO更“成功”了。今年SamAltman成功实现两次爆火,第一次是ChatGPT的发布,如果说......
  • 命名关键字参数
    命名关键字参数(1)在函数内判断在定义了**kwargs参数后,函数调用就可以传入任意的关键字参数key=value如果函数体代码的执行需要依赖某个key,就必须在函数内进行判断defregister(name,age,**kwargs):if'sex'inkwargs:#有sex参数passif'heig......