- 创建结构体
struct Sport{
var name: String
}
var tennis = Sport(name: "Tennis")
print(tennis.name)
- 计算属性
struct Sport{
var name: String
var isOlympicSport: Bool
//计算属性
var olympicStatus: String{
if isOlympicSport {
return "\(name) is an Olympic sport"
}else {
return "\(name) is not an Olympic sport"
}
}
}
var tennis = Sport(name: "Tennis",isOlympicSport: true)
print(tennis.olympicStatus)
- 属性观察器
willSet:在属性更改之前执行操作(很少使用)
didSet:在属性更改之后执行操作
struct Progress{
var task: String
var amount: Int{
didSet{
print("\(task) is now \(amount)% complete.")
}
}
}
var progress = Progress(task: "Download", amount: 78)
progress.amount=23
print(progress)
- 方法
struct City{
var population: Int
func collectTaxes() -> Int{
return population * 1000
}
}
let london = City(population: 9_000_000)
print("放大1000倍: " + String(london.collectTaxes()))
- Mutating方法
若要在方法内部更改属性时,使用mutating关键字对其进行标记
struct Person {
var name: String
mutating func makeAnonymous(){
name = "Anonymous"
}
}
var person = Person(name: "Ed")
print("调用可变方法前: \(person.name)")
person.makeAnonymous()
print("调用可变方法后: \(person.name)")
- 初始化器
struct FamilyTree {
init() {
print("Creating family tree!")
}
}
struct User {
var userName: String
//懒加载 lazy
lazy var familyTree = FamilyTree()
//⚠️Swift中,必须确保初始化结束之前所有属性都具有一个值
init(userName: String) {
self.userName = userName
//self:指向当前正在使用的该结构体的任何实例
print("Creating a new user: \(userName)!")
}
}
var user = User(userName: "Andy")
user.familyTree
- 静态属性和方法
struct Student {
static var classSize = 0
var name: String
init(name: String){
self.name = name
Student.classSize += 1
}
}
print(Student.classSize)
var student = Student(name: "Lily")
print(Student.classSize)
- 访问控制
private
:只能在当前类里访问 (注意:Swift4
中,extension
里也可以访问private
的属性。)
fileprivate
:只能在当前的Swift
文件中访问
internal
(默认访问级别,该关键字可写可不写):
1. 在源代码所在的整个模块都可以访问。
2. 如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。
3. 如果是App
代码,也是在整个App
代码,也是在整个 App 内部可以访问。public
:可以被任何人访问。但其他module
中不可以被override
和继承,而在module
内可以被override
和继承。
open
:可以被任何人使用,包括override
和继承。
open > public > interal >fileprivate > private
struct Person2{
private var id: String
init(id: String){
self.id = id
}
func identify() -> String{
return "My social security number is \(id)"
}
}
var person2 = Person2(id: "2116110253")
//print(person2.id)❌
print(person2.identify())
- 总结
- 可以使用结构体创建自己的类型,这些结构体可以具有自己的属性和方法
- 可以使用存储属性或者使用计算属性即时计算值
- 若要在方法内部更改属性,则必须将其标记为mutating
- 初始化器是创建结构体的特殊方法。默认情况下,将获得一个成员初始化器,但如果创建自己的初始化器,则必须为所有属性赋一个值
- 使用self常量可以在方法内部引用结构体的当前实例
- lazy关键字告诉Swift仅在首次使用属性时才创建属性
- 可以使用static关键字在结构体的所有实例之间共享属性和方法
- 访问控制可以限制哪些属性和方法的代码是可以给外部使用的