Runhua's Blog

森林睡了,故事醒了

尾随闭包

处理闭包表达式较长的情况

如果您需要将闭包表达式传递给函数作为函数的最终参数,并且闭包表达式很长,则将其写为尾随闭包可能是有用的。您在函数调用的括号后写一个尾随闭包,即使尾随闭包仍然是函数的参数。当您使用尾随闭包语法时,您不会将第一个闭包的参数标签作为函数调用的一部分。函数调用可以包括多个尾随闭包;然而,以下前几个示例使用单个尾随闭包。 func someFunctionThatTakesAClosure(closu...

使用SwiftUI的AsyncImage从URL渲染远程图像

异步加载图片的新方式

标注 本文翻译自Using SwiftUI’s AsyncImage to render remote images from URLs 2021 年发布的SwiftUI推出了一种名为AsyncImage的全新内置视图,它提供了一种从URL下载和渲染远程图像的简单方法。在非常基本的层面上,如果我们只想按原样呈现下载的图像,那么现在可以这样完成: struct ProductV...

Closures初步

Swift强大的闭包功能

闭包(Closures)是自包含的功能块,可以在代码中传递和使用。Swift中的闭包类似于C和Objective-C中的块以及其他编程语言中的lambdas。 闭包可以从定义常量和变量的上下文中捕获和存储对任何常量和变量的引用。这被称为关闭这些常量和变量。Swift为您处理捕获的所有内存管理。 函数中引入的全局函数和嵌套函数实际上是闭包的特殊情况。关闭采取三种形式之一: 全局函数是...

具有隐式返回的函数

函数返回区域不一定要有return关键字

如果函数的整个主体都是单个表达式,则函数隐式返回该表达式。例如,以下两个函数都有相同的行为: func greeting(for person: String) -> String { "Hello, " + person + "!" } print(greeting(for: "Dave")) // Prints "Hello, Dave!" func anotherGre...

函数的类型

更多有关函数的知识点

每个函数都有特定的函数类型,由参数类型和函数的返回类型组成。例如: func addTwoInts(_ a: Int, _ b: Int) -> Int { return a + b } func multiplyTwoInts(_ a: Int, _ b: Int) -> Int { return a * b } 此示例定义了两个简单的数学函数,称为addT...

随机向量的均值

矩阵期望计算常见的公式

设$\pmb{x}$为$n \times 1$维度的随机向量,记$\pmb{A}$为$n \times n$维度的矩阵,并设 \[E[\pmb{x}] = \pmb{\mu}\] \[Var[\pmb{x}] = \pmb{\Sigma}\] 则由如下等式成立: \[E[\pmb{x}^T A \pmb{x}] = tr(\pmb{A}\pmb{\Sigma}) + \pmb{\mu...

函数参数标签和参数名称

如何起好函数的参数名

每个函数参数都有一个参数标签和一个参数名称。调用函数时使用参数标签;每个参数都写在函数调用中,前面有参数标签。参数名称用于实现函数。默认情况下,参数使用其参数名称作为参数标签。 func someFunction(firstParameterName: Int, secondParameterName: Int) { // In the function body, firstPa...

检查API可用性

不是所有的API都可以在任何平台随意使用

Swift内置了对检查API可用性的支持,这确保您不会意外使用给定部署目标上不可用的API。 编译器使用SDK中的可用性信息来验证代码中使用的所有API是否在项目指定的部署目标上可用。如果您尝试使用不可用的API,Swift会在编译时报告错误。 您在if或guard语句中使用可用性条件执行代码块,具体取决于您要使用的API在运行时是否可用。编译器在验证该代码块中的API是否可用时,会使用...

可选的元组返回类型

防止异常获取发生

如果要从函数返回的元组类型有可能对整个元组具有“无值”,您可以使用可选的元组返回类型来反映整个元组可以为nil的事实。您通过在元组类型的结束括号后放置问号来编写可选的元组返回类型,例如(Int,Int)?或者(String,Int,Bool)? 标注 可选的元组类型,如(Int,Int)?不同于包含可选类型的元组,如(Int?,Int?)。对于可选的元组类型,整个元组是可选的,...

具有多个参数返回值的函数

元组的妙用

Swift支持使用元组类型作为函数返回多个值作为复合返回值的一部分的返回类型。 下面的示例定义了一个名为minMax(array:)的函数,该函数在Int值数组中找到最小和最大的数字: func minMax(array: [Int]) -> (min: Int, max: Int) { var currentMin = array[0] var currentMa...

在Swift中使用let获取模式匹配的值

Let x in where

Switches支持任何类型的数据和各种各样的比较操作——它们不限于整数和等式测试。 import Foundation let vegetable = "red pepper" switch vegetable { case "celery": print("Add some raisins and make ants on a log.") case ...

在SwiftUI中使用VideoPlayer播放视频

iOS14的新特性

SwiftUI的VideoPlayer视图允许我们从任何本地或远程URL播放电影。它来自AVKit框架,因此在试用之前,您应该确保并添加导入AVKit。 import AVKit 例如,如果您的应用程序包中有video.mp4,并想播放它,您将使用此功能: VideoPlayer(player: AVPlayer(url: Bundle.main.url(forResource: "v...

使用SwiftUI获取macOS任意文件夹下的图片

NSOpenPanel的用法

NSOpenPanel框架允许开发人员获取macOS系统本地的资源库,如果用户想通过访问路径获取加载本地资源库中的一张照片,可使用以下函数打开仪表盘: func showOpenPanel() -> URL? { let openPanel = NSOpenPanel() openPanel.allowedContentTypes = [.image] ...

如何将SwiftUI视图转换为图像

drawHierarchy的用法

SwiftUI的视图没有将视图渲染为图像的内置功能,但我们可以在很短的时间内自己编写视图。这里的关键是使用UIHostingController包装视图,然后将其视图层次结构渲染为UIGraphicsImageRenderer。 这最好使用View上的扩展程序完成,因此您可以自然调用它。这应该将视图包装在托管控制器中,将托管控制器视图的大小调整为SwiftUI视图的内在内容大小,清除任何背...

矩阵迹的性质

一些常用的矩阵期望计算准则

基础性质 设$r$为标量,则有 \[tr(\pmb{A}+\pmb{B}) = tr(\pmb{A}) + tr(\pmb{B})\] \[tr(r\pmb{A}) = r \cdot tr(\pmb{A})\] \[tr(\pmb{A}) = tr(\pmb{A}^T)\] 矩阵乘积的迹 \[tr(\pmb{A}\pmb{B}) = tr(\pmb{B}\pmb{A})\] \...

扩展卡尔曼滤波原理

基于泰勒展开式的卡尔曼滤波公式变形

摘要 本文在线性最优滤波的基础上结合正交投影详细介绍扩展卡尔曼滤波的数学原理并给出了数学推导过程。 基础背景 扩展卡尔曼滤波[1]作为卡尔曼滤波的扩展,在非线性系统的应用中取得了相当的成功。阅读本文前需要读者先行阅读卡尔曼滤波原理[2]并理解其中的正交投影的数学原理。本文数学推导部分采用的标记与卡尔曼论文的标记类似。 符号约定 本文主要处理离散系统,即信号将会在相同的时间间...