无涯教程-Swift - Properties(属性)

78 阅读3分钟

Swift 4语言为类,枚举或结构提供属性以关联值。

存储属性

Swift 4引入了存储属性的概念来存储常量和变量的,常量的存储属性由let关键字定义,变量的存储属性由var关键字定义。

  • 在定义期间, 存储的属性提供"默认值"
  • 初始化期间,用户可以初始化和修改初始值
struct Number {
   var digits: Int
   let pi=3.1415
}

var n=Number(digits: 12345) n.digits=67

print("(n.digits)") print("(n.pi)")

运行上述程序时,我们得到以下输出-

67
3.1415

考虑以上代码中的以下行-

let pi=3.1415

在此,pi=3.1415将变量pi初始化为存储的属性值。

下面的示例通过let来定义不可改变的存储属性。

struct Number {
   var digits: Int
   let numbers=3.1415
}

var n=Number(digits: 12345) n.digits=67

print("(n.digits)") print("(n.numbers)") n.numbers=8.7

运行上述程序时,我们得到以下输出-

error: cannot assign to numbers in n
n.numbers=8.7

而不是将"numbers"重新初始化为8.7,而是返回一条错误消息,指出"numbers"被声明为常量。

惰性存储属性

Swift 4提供了一个名为“惰性存储属性"的属性,该属性在首次初始化变量时不会计算初始值。lazy修饰符用于变量声明之前,以使其惰性存储属性。

class sample {
   lazy var no=number()    //`var` 声明是必需的。
}

class number { var name="Swift 4" }

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

运行上述程序时,我们得到以下输出-

Swift 4

计算属性

与存储值无关,计算的属性提供了一个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) }

  </span><span class="kwd">set</span><span class="pun">(</span><span class="pln">axis</span><span class="pun">){</span><span class="pln">
     no1</span><span class="pun">=</span><span class="pln">axis</span><span class="pun">.</span><span class="lit">0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="pun">(</span><span class="pln">length</span><span class="pun">/</span><span class="lit">2</span><span class="pun">)</span><span class="pln">
     no2</span><span class="pun">=</span><span class="pln">axis</span><span class="pun">.</span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="pun">(</span><span class="pln">breadth</span><span class="pun">/</span><span class="lit">2</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

} }

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

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

运行上述程序时,我们得到以下输出-

(150.0, 75.0)
-150.0
-65.0

当计算的属性未定义新值时,将为该特定变量设置默认值。

只读属性

计算属性中的只读属性定义为具有getter但不包含setter的属性,它始终用于返回值。通过“."进一步访问变量。

class film {
   var head=""
   var duration=0.0
   var metaInfo: [String:String] {
      return [
         "head": self.head,
         "duration":"\(self.duration)"
      ]
   }
}

var movie=film() movie.head="Swift 4 Properties" movie.duration=3.09

print(movie.metaInfo["head"]!) print(movie.metaInfo["duration"]!)

运行上述程序时,我们得到以下输出-

Swift 4 Properties
3.09

属性观察器

在Swift 4中,观察和响应属性值使用了属性观察器,每次设置属性值时,都会调用属性观察器,除了惰性存储的属性,我们还可以通过"overriding"方法将属性观察器添加到"inherited"属性中。

class Samplepgm {
   var counter: Int=0 {
      willSet(newTotal){
         print("Total Counter is:\(newTotal)")
      }
  didSet </span><span class="pun">{</span><span class="pln">
     </span><span class="kwd">if</span><span class="pln"> counter </span><span class="pun">&gt;</span><span class="pln"> oldValue </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Newly Added Counter\(counter - oldValue)"</span><span class="pun">)</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

} }

let NewCounter=Samplepgm() NewCounter.counter=100 NewCounter.counter=800

运行上述程序时,我们得到以下输出-

Total Counter is: 100
Newly Added Counter 100
Total Counter is: 800
Newly Added Counter 700

类型属性

在类型定义部分使用大括号{}定义属性,并且变量的范围也已在前面定义。为了为值类型定义类型属性,使用" static"关键字,对于类类型使用" class"关键字。

struct Structname {
   static var storedTypeProperty=" "
   static var computedTypeProperty: Int {
      //return an Int value here
   }
}

enum Enumname { static var storedTypeProperty=" " static var computedTypeProperty: Int { //return an Int value here } }

class Classname { class var computedTypeProperty: Int { //return an Int value here } }

查询和设置属性

就像实例属性一样,查询类型属性并设置为“."。语法仅针对类型,而不是指向实例。

struct StudMarks {
   static let markCount=97
   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=98 print(stud1Mark1.InternalMarks)

stud1Mark2.InternalMarks=87 print(stud1Mark2.InternalMarks)

运行上述程序时,我们得到以下输出-

97
87

参考链接

www.learnfk.com/swift/swift…