1.结构体

Swift结构体是构建代码所用的一种通用而且灵活的构造体
可以为结构体定义属性与方法,扩展结构体的功能

与C与Objective-C不同的是

  • 结构体不需要包含实现文件与接口
  • 结构体允许我们创建单一文件,而且系统会自动生成面向其他代码的外部接口

语法

struct nameStruct { 
   Definition 1
   Definition 2
   ……
   Definition N
}

实例:

  1. 在结构体中定义几个属性
struct MarkStruct{
   var num1: Int
   var num2: Float
   var mark3: Double
}
  1. 在结构体中定义带值的属性并调用
struct studentMarks {
   var mark1 = 100
   var mark2 = 78
   var mark3 = 98
}

//实例调用
let test = studentMarks()
print("mark1是\(test.mark1)")

结构体应用注意

  • 结构体的主要目的是用来封装少量相关简单数据值
  • 有理由预计一个结构体实例在赋值或者传递时,封装的数据将会被拷贝而不是被引用
  • 任何在结构体中储存的值类型属性,也会被拷贝,而不是被引用

结构体实例化

可通过以下方法对结构体进行实例化

struct markStruct{
    var mark1: Int
    var mark2: Int
    var mark3: Int
    
    init(mark1: Int, mark2: Int, mark3: Int){
        self.mark1 = mark1
        self.mark2 = mark2
        self.mark3 = mark3
    }
}

通过init函数进行初始化,通过调用self的属性来为结构体内容赋值(类似python)

实例化对象
var fail = markStruct(mark1: 34, mark2: 42, mark3: 13)

2.类

Swift中的类是构建代码所用的一种通用而且灵活的构造体
可以为类定义属性与方法

与结构体的区别

  • 允许一个类继承另外类的特征
  • 类型转换允许在运行时检查与解释一个类实例的类型
  • 引用计数允许对一个类的多次引用(??)

语法

class classname {
   Definition 1
   Definition 2
   ……
   Definition N
}

范例:
定义若干个属性

class student{
   var studname: String
   var mark: Int 
   var mark2: Int 
}

实例化
let Ann = student()

带有初始化函数init的类

class student{
   var mark: Int 
   init(mark: Int){
	self.mark=mark
	} 
}

实例化
let ken = student(mark: 412)
调用
print("成绩为 \(Ken.mark)")

恒等运算符

为了能够判定两个常量或者变量是否引用同一个实例,Swift内建了两个恒等运算符

运算符不恒等运算符
===如果两个常量或者变量引用同一个类实例则返回true
!==如果两个常量或者变量引用不同类实例则返回true

3.属性

①存储属性

一个存储属性就是存储在特定类或者结构体的实例里的一个常量或者变量,存储属性可以是变量存储属性(var),也可以是常量存储属性(let)

  • 可以在定义存储属性的时候指定默认值
  • 也可以在构造过程中设置或者修改存储属性的值

②延迟存储属性

延迟存储属性是指当第一次被调用的时候才会计算其初值的属性
在属性声明前使用lazy来标识一个延迟存储属性
必须将延迟存储属性声明成变量var,因为常量属性在构造过程完成之前必须要有初值

延迟属性一般用于:

  • 延迟对象的创建
  • 当属性的值依赖于其他未知类

实例代码(来自菜鸟教程):

class sample {
    lazy var no = number() // `var` 关键字是必须的
}

class number {
    var name = "Runoob Swift 教程"
}

var firstsample = sample()
print(firstsample.no.name)

③计算属性

类,结构体与枚举可以定义计算属性
计算属性不直接存储值,而是提供一个getter来获取值,一个可选的setter来间接设置其他属性或者变量的值

实例代码:

class sample {
    var no1 = 0.0, no2 = 0.0
    var length = 300.0, breadth = 150.0
    
    var middle: (Double, Double) {
        get{
            return (length / 2, breadth / 2)
        }
        set(axis){
            no1 = axis.0 - (length / 2)
            no2 = axis.1 - (breadth / 2)
        }
    }
}


var result = sample()
print(result.middle)
result.middle = (0.0, 10.0)

print(result.no1)
print(result.no2)

middle中的get是通过类中的两个值来return值
print(result.middle)
get方法中计算完再返回(150.0, 75.0)

具体释义: middle中的set(axis)用于设置值
因此result.middle = (0.0, 10.0),就是相当于将
axis = (0.0, 10.0)
axis.0就是axis中的第一个参数即 0.0
axis.1就是axis中的第二个参数即 10.0

④只读计算属性

只有getter没有setter的计算属性

⑤属性观察器

可以用来响应与监控属性值的变化,每次属性被设置的时候都会调用属性观察器,即使新值与旧值相等也不例外

  • willSet 在设置新值之前调用
  • didSet 在设置新的值后立即调用
  • 两者与观察器在初始化过程中不会被调用

实例代码:

class Samplepgm {
    var counter: Int = 0{
        willSet(newTotal){
            print("修改: \(newTotal)")
        }
        didSet{
            if counter > oldValue {
                print("新增数 \(counter - oldValue)")
            }
        }
    }
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800

输出结果:

修改: 100
新增数 100
修改: 800
新增数 700

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议