Swift 那些特有的语法结构

引言

刚开始接触到iOS 开发时,便是使用Swift语言进行开发,在大致看了一下Swift相关文档的目录结构后,感觉跟其他语言大差不差,便随意扫了一遍,但是在接触的时间变长后,渐渐发现,它的很多特殊的语法我都给忽略了,都是遇到时现查一番,本文便是对遇到的特殊语法的一个简要总结

关键字

weak

用于声明弱引用,主要用于解决实例循环强引用的问题。在类之间相互引用时,如果使用强引用(默认情况下),可能会导致循环引用,从而造成内存泄漏

本篇文章详细的介绍了weak的用法,同时还提到了另一个解决实例循环强引用问题的关键字unowned

lazy

用于声明延时加载存储属性,将属性的初始化推迟到第一次访问该属性的时候,而不是在对象初始化时立即执行

  • lazy声明的属性必须声明为变量(var),因为一旦初始化,它们的值可以在后续访问中改变
  • lazy属性在第一次访问后会保留其值,因此它只会初始化一次

本篇文章详细介绍了延时加载存储属性的概念

struct 结构体

struct 结构体class 类看起来挺相似的,无论长相还是写法,但是结构体还是与有着很多区别的:

  • 值类型
  • 不支持继承
  • 具有自动生成的成员初始化器
  • 属性默认不可变,要声明为var才可变

本篇文章对比介绍了struct 结构体class 类的区别

最大的区别:struct是值类型,而class是引用类型

private(set)

  • private用于限制整个成员(包括读取和设置)
  • private(set)用于限制属性的设置操作,但外部能读取

Swift提供了五个访问控制级别的修饰符:openpublicinternalfile privateprivate

访问级别修饰符都支持带上一个参数,该参数由一对圆括号和其中的set关键字组成

typealias:类型别名

typealiasSwift中的一个关键字,用于为现有的数据类型(包括结构体枚举协议函数类型等)定义一个别名。这个别名可以用来更方便地引用复杂的数据类型,提高代码的可读性和可维护性

try 和 try?

  • try:显示处理错误

    使用try表示希望捕获可能的错误并进行处理。如果发生错误,程序将抛出一个异常,可以使用do-catch块进行错误处理

  • try?:错误默认返回nil

    使用try?表示希望尽量避免处理错误,而是将结果作为可选值处理。如果代码执行成功,将返回结果值;如果发生错误,将返回nil

运算符

!:强制解析

!可选类型(?)的值强制解包,确定值不会为nil可使用,否则会导致运行崩溃

?:可选类型

可选类型Swift中用于处理可能包含空值(nil)的值的机制。可选类型有两种可能的值:

  • 有值:表示包含了一个具体的值
  • 无值(nil):表示没有值

??:空合并运算符

??的作用是在可选值nil时提供一个默认值,以防止使用可选值时出现nil引发的问题

区间运算符

  • a...b:闭区间运算符。表示一个从ab(包括ab)的闭区间范围
  • a...<b:半开区间运算符。表示一个从ab(包括a,但不包括b)的半开区间范围

属性观察器

  • willSet:在新的值被设置之前调用。可以在属性值即将发生变化时执行额外的代码
  • didSet:在新的值被设置之后调用。可以在属性值发生变化后执行额外的代码
swift 复制代码
// 在类型 {} 内使用
var property: Int {
    willSet {
        // 在属性值将要被设置前执行的代码
    }
    
    didSet { 
        // 在属性值被设置后执行的代码 
    }
}

数据类型

字典

字典这个数据类型在其他语言中也有,并不特殊,此处列出仅是其写法比较特殊,有些类似数组:

swift 复制代码
[KeyType: ValueType]

// 声明
var person = ["name": "Mary", "age": "18"]
// 添加
person["sex"] = "female"
// 访问
let personName = person["name"]
// 更新
person["name"] = "Alice"
// 删除
person["name"] = nil

枚举

枚举这个数据结构应该也是不陌生了,此处列出是因为在Swift中广泛的使用枚举关联值这个概念,在此便着重声明一下

枚举是一种在编程中用于定义命名常量集合的数据类型。枚举是一种有限的、离散的数据类型,它包含一组可能的值

swift 复制代码
// 带关联值的枚举:可以为枚举成员添加关联值,以便在枚举的不同成员之间传递数据
enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

本篇文章详细的介绍了枚举相关的概念

元组

元组这个数据结构在其他的语言(如:Python)也是存在的,此处列出是为了说明一下在Swift元组的使用操作

元组可以包含不同类型的值,而且可以包含任意数量的值

swift 复制代码
// 写法一
(value1, value2)
// 写法二
(key1: value1, key2: value2)

key时通过key访问,没有时通过下标索引访问

swift 复制代码
let person1 = ("John", 30)
let name1 = person1.0 

let person2 = (name: "John", age: 30)
let name2 = person2.name

语法

\():字符串插值语法

\()用于将变量、常量、表达式或其他值嵌入到字符串字面量中,以创建一个新的字符串。这允许在字符串中包含变量或表达式的值,使字符串更加动态和可变

guard 语句

guard语句是Swift中用于执行条件检查并提前退出函数、方法或循环的结构之一。它通常与else子句一起使用,用于在条件不满足时执行特定的操作

swift 复制代码
guard condition else {

}

闭包

Swift中的闭包通常表示为用花括号{}包裹的一段代码块。这个代码块可以接受参数、返回值,以及在其中执行特定的操作

闭包是一种自包含的功能块,可以在代码中传递和引用,也可以在需要时执行

swift 复制代码
{ (parameters) -> ReturnType in
    // 闭包体,执行特定的操作
}

闭包作为参数传入函数,能使得函数更灵活、更通用。闭包在作为函数的参数传入时,可以将闭包的闭包体约等于是函数的函数体

尾随闭包:如果函数的最后一个参数是闭包类型,可以将闭包表达式写在函数调用的圆括号外部,作为函数调用的一部分

协议

待更新

小结

语言是基础,你可能会由于各种原因接触到多种语言,但是打牢基础是无论做什么都需要遵循的准则。对于编程,我对打牢语言基础的感悟便是掌握牢固了才能看懂代码~

相关推荐
大熊猫侯佩7 小时前
Swift 6.2 列传(第十三篇):香香公主的“倾城之恋”与优先级飞升
swift·编程语言·apple
专业开发者12 小时前
调试 iOS 蓝牙应用的新方法
物联网·macos·ios·cocoa
1024小神14 小时前
Swift配置WKwebview加载网站或静态资源后,开启调试在电脑上debug
swift
tangbin58308516 小时前
iOS Swift 可选值(Optional)详解
前端·ios
卷心菜加农炮1 天前
基于Python的FastAPI后端开发框架如何使用PyInstaller 进行打包与部署
ios
北极象2 天前
千问大模型接入示例
ios·iphone·qwen
ipad协议开发2 天前
企业微信 iPad 协议应用机器人开发
ios·企业微信·ipad
kkoral2 天前
基于MS-Swift 为 Qwen3-0.6B-Base 模型搭建可直接调用的 API 服务
python·conda·fastapi·swift
QuantumLeap丶2 天前
《Flutter全栈开发实战指南:从零到高级》- 26 -持续集成与部署
android·flutter·ios
2501_915918413 天前
TCP 抓包分析在复杂网络问题中的作用,从连接和数据流层面理解系统异常行为
网络·网络协议·tcp/ip·ios·小程序·uni-app·iphone