Swift 4属性介绍和用法详细示例

本文概述

Swift4属性用于关联类, 枚举或结构的值。

Swift4属性可以分为两种类型:

  • 存储的属性
  • 计算属性

存储的属性与计算的属性之间的区别

储存属性 计算属性
存储的属性将常量和变量值存储为实例。 计算的属性用于计算值, 而不是存储值。
存储的属性由类和结构提供。 计算的属性由类, 枚举和结构提供

存储属性和计算属性都与实例类型相关联。当属性与其类型值相关联时, 则将其定义为”类型属性”。

存储和计算的属性通常与特定类型的实例相关联。属性也可以与类型本身关联。这样的属性称为类型属性。

属性观察器用于观察存储属性的值, 也可以观察从超类派生的继承子类的属性。

储存属性

在Swift4中, 常量的存储属性由’let’关键字定义, 变量的存储属性由’var’关键字定义。存储的属性在定义期间提供”默认值”, 并且用户可以在初始化期间对其进行初始化和修改。

例子

struct Number {
   var digits: Int
   let pi = 3.1415
}
var n = Number(digits: 123456789)
n.digits = 910
print("\(n.digits)")
print("\(n.pi)")

输出

910
3.1415

在此, 实例pi = 3.1415将变量pi初始化为存储的属性值。因此, 无论何时引用该实例, 它都将保留值3.1415。

懒惰的存储属性

惰性存储属性是Swift4的灵活属性。首次初始化变量时, 它不计算初始值。变量声明之前使用”惰性”修饰符作为惰性存储属性。

使用惰性属性:

  • 延迟对象创建。
  • 当属性依赖于类的其他部分时, 尚不知道。

例子

class sample {
   lazy var no = number()    // `var` declaration is required.
}
class number {
   var name = "srcmini"
}
var firstsample = sample()
print(firstsample.no.name)

输出

srcmini

实例变量

在Objective-C中, 存储的属性具有用于备份的实例变量, 并存储在存储的属性中声明的值。

Swift 4将这两个概念合并到单个”存储属性”声明中。 “存储属性”不具有相应的实例变量和备份值, 而是包含在单个位置中通过变量名称, 数据类型和内存管理功能定义的关于变量属性的所有集成信息。

计算属性

计算属性提供了一个getter和一个可选的setter, 以间接检索和设置其他属性和值, 而不是存储它们。

例子

class sample {
   var no1 = 0.0, no2 = 0.0
   var length = 200.0, breadth = 100.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)

输出

(100.0, 50.0)
-100.0
-40.0

计算属性为Property Observer

Swift4使用属性观察器来观察和响应属性值。设置属性值时, 每次都会调用属性观察器。除了惰性存储的属性, 我们可以通过”覆盖”方法将属性观察器添加到”继承的”属性中。

你可以定义属性观察者之一:

  • 在存储值之前-willset
  • 存储新值后-didset
  • 在初始化程序中设置属性时, 将无法调用willset和didset观察者。

例子

class Samplepgm {
   var counter: Int = 0 {
      willSet(newTotal){
         print("Total Counter is: \(newTotal)") 
      }
      didSet {
         if counter > oldValue {
            print("Newly Added Counter \(counter - oldValue)")
         }
      }
   }
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 500

输出

Total Counter is: 100
Newly Added Counter 100
Total Counter is: 500
Newly Added Counter 400

局部变量与全局变量

局部变量和全局变量都用于计算和观察属性。

Local Variables Global Variables
局部变量在函数, 方法或闭包上下文中定义。 全局变量在函数, 方法, 闭包或类型上下文之外定义。
局部变量用于存储和检索值。 全局变量用于存储和检索值。
存储的属性用于获取和设置值。 存储的属性用于获取和设置值。
在局部变量中, 使用计算属性。 在全局变量中, 也使用计算属性。

Swift4类型属性

Swift4属性在花括号{}的类型定义部分中定义, 并且变量的范围也已在前面定义。要定义值类型的类型属性, “静态”?使用关键字, 对于类类型, 使用?class?使用关键字。

句法:

struct Struct_Name {
   static var storedTypeProperty = " "
   static var computedTypeProperty: Int {
      // return an Int value here
   }
}
enum Enum_Name {
   static var storedTypeProperty = " "
   static var computedTypeProperty: Int {
      // return an Int value here
   }
}
class Class_Name {
   class var computedTypeProperty: Int {
      // return an Int value here
   }
}

如何设置和查询类型属性?

Swift4类型属性的设置和查询与实例属性相同。它用 ‘。’语法仅针对类型, 而不是指向实例。

例子

struct StudMarks {
   static let markCount = 85
   static var totalCount = 0
   var InternalMarks: Int = 0 {
      didSet {
         if InternalMarks > StudMarks.markCount {
            InternalMarks = StudMarks.markCount
         }
         if InternalMarks > StudMarks.totalCount {
            StudMarks.totalCount = InternalMarks
         }
      }
   }
}
var stud1Mark1 = StudMarks()
var stud1Mark2 = StudMarks()
stud1Mark1.InternalMarks = 80
print(stud1Mark1.InternalMarks)
stud1Mark2.InternalMarks = 90
print(stud1Mark2.InternalMarks)

输出

80
85

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?