Swift 结构体

  • 创建结构体
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())

  • 总结
  1. 可以使用结构体创建自己的类型,这些结构体可以具有自己的属性和方法
  2. 可以使用存储属性或者使用计算属性即时计算值
  3. 若要在方法内部更改属性,则必须将其标记为mutating
  4. 初始化器是创建结构体的特殊方法。默认情况下,将获得一个成员初始化器,但如果创建自己的初始化器,则必须为所有属性赋一个值
  5. 使用self常量可以在方法内部引用结构体的当前实例
  6. lazy关键字告诉Swift仅在首次使用属性时才创建属性
  7. 可以使用static关键字在结构体的所有实例之间共享属性和方法
  8. 访问控制可以限制哪些属性和方法的代码是可以给外部使用的

本博文中的案例来自【100 Days of SwiftUI——结构体】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值