级别: ★☆☆☆☆
标签:「iOS」「Swift 5.1」「结构体」「类」「mutating」
做者: 沐灵洛
审校: QiShare团队php
结构体和类是多功能的,灵活的结构,是程序中代码的构建块。咱们可使用与定义常量,变量和函数相同的语法来定义属性和方法,为咱们的结构体和类添加功能。 Swift中咱们为自定义的结构体和类不须要建立单独的.h和.m文件。而是在单个文件中定义结构体或类便可,而且Swift会提供额外的接口,自动让类或结构体在其余代码中可用。git
在Swift中,结构体和类有许多相像的地方。github
extend
,在函数的默认实现的基础上能够扩展其功能。同时,类具备结构体所没有的附加功能:编程
语法定义swift
结构和类具备类似的定义语法。使用struct
关键字定义一个结构体。使用class
关键字定义类。数组
struct SomeStructure {
}
class SomeClass {
}
复制代码
结构体和类的实例bash
结构和类构建新实例的最简单的初始化语法:使用类或结构体的类型名称,后跟空括号。微信
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let someResolution = Resolution()
let someVideoMode = VideoMode()
复制代码
属性访问闭包
使用**.
**语法进行结构体和类的属性的访问app
let width = someResolution.width
let width = someVideoMode.resolution.width
复制代码
使用**.
**语法为属性赋新值
someResolution.width = 250
someVideoMode.resolution.width = 255
复制代码
结构体类型的成员初始化方法
全部结构体都有一个自动生成的初始化方法。咱们可使用这个自动生成的初始化方法初始化一个新的实例对象,并根据初始化方法的参数(结构体中定义的属性名称),设置成员的属性。
let someResolution = Resolution(width: 33, height: 77)
复制代码
与结构体不一样,类没有默认的成员初始化方法。
相似Swift中的整数,浮点数,布尔值,字符串,数组和字典,都是值类型的,而且这些类型在Swift中的实现都是基于结构体的。故全部结构体和枚举值类型都是值类型。这意味着咱们建立的任何结构体和枚举实例以及做为它们属性的任何值类型,在代码中传递时始终会被复制。 注意:标准库定义的集合,如:数组,字典和字符串使用优化来下降复制的性能成本。这些集合类型不是当即复制,而是共享内存,其元素存储在原始实例和任何副本之间。若是须要修改集合的其中一个副本,则会在修改以前复制集合中的全部元素。可是咱们在代码中看到的好像老是当即发生了复制。
let someResolution = Resolution(width: 33, height: 77)
var myResolution = someResolution
复制代码
在这个赋值的过程当中,因为Resolution
是值类型的,因此首先会生成someResolution
实例的副本并将此副本赋值给myResolution
。此时someResolution
和myResolution
具备相同的宽度和高度,可是倒是两个不一样的实例。
myResolution.width = 255
复制代码
someResolution
和myResolution
是两个单独的实例,因此修改副本myResolution
的属性width
,并不会影响someResolution
的width
。 枚举类型也是值类型,具备和结构体同样的赋值特性:复制
enum CompassPoint {
case north, south, east, west
mutating func turnNorth() -> Void {
self = .north
}
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection.turnNorth()
print("当前的方向,被改变后 \(currentDirection)")//!< 当前的方向,被改变后 north
print("保存的方向 \(rememberedDirection)")//!< 保存的方向 west
复制代码
使用mutating
关键字放在枚举或结构体中所定义方法的func
关键字以前,使得该方法能够在方法中修改枚举或结构体的属性。 当currentDirection
赋值给rememberedDirection
时,rememberedDirection
拥有的是currentDirection
实例的副本。此后更改currentDirection
的值不会影响存储在rememberedDirection
中值。由于彼此独立。
与值类型不一样,引用类型在分配给变量或常量时或者传递给函数时不会被复制,而是使用对同一实例的引用。
let tenEighty = VideoMode()
tenEighty.resolution = someResolution
tenEighty.interlaced = true
tenEighty.name = "视频模式"
tenEighty.frameRate = 25.0
//赋值给新的实例对象
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print(tenEighty.frameRate,alsoTenEighty.frameRate)
//!< tenEighty.frameRate:30.0 alsoTenEighty.frameRate:30
复制代码
身份运算符
参考swift 5.1基础(二)运算符讲解。
指针
Swift中引用某个引用类型的实例做为常量或变量时,相似于C中的指针,但它不是指向内存中地址的直接指针(不是直接寻址),而且不须要编写星号*
来指示你正在建立一个引用对象。相反,这些引用的定义与Swift中的任何其余常量或变量同样。 另:Swift标准库提供指针和缓冲类型,若是须要直接与指针交互,可使用它们 手动内存管理。
参考资料: swift 5.1官方编程指南
了解更多iOS及相关新技术,请关注咱们的公众号:
小编微信:可加并拉入《QiShare技术交流群》。
关注咱们的途径有:
QiShare(简书)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公众号)
推荐文章:
Swift 实现一个兼容iOS、tvOS、OSX的抽象层
iOS Password AutoFill
iOS 给UILabel添加点击事件
用SwiftUI给视图添加动画
用SwiftUI写一个简单页面
Swift 5.1 (7) - 闭包 iOS App启动优化(三)—— 本身作一个工具监控App的启动耗时
iOS App启动优化(二)—— 使用“Time Profiler”工具监控App的启动耗时
iOS App启动优化(一)—— 了解App的启动流程
奇舞周刊