激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 詳解Swift中屬性的聲明與作用

詳解Swift中屬性的聲明與作用

2020-08-31 11:01琿少 Python

Swift中的屬性可以被分為存儲(chǔ)屬性和計(jì)算屬性,本文將為大家詳解Swift中屬性的聲明與作用,需要的朋友可以參考下

一、引言

屬性將值與類,結(jié)構(gòu)體,枚舉進(jìn)行關(guān)聯(lián)。Swift中的屬性分為存儲(chǔ)屬性和計(jì)算屬性兩種,存儲(chǔ)屬性用于存儲(chǔ)一個(gè)值,其只能用于類與結(jié)構(gòu)體,計(jì)算屬性用于計(jì)算一個(gè)值,其可以用于類,結(jié)構(gòu)體和枚舉。

二、存儲(chǔ)屬性

存儲(chǔ)屬性使用變量或者常量來(lái)存儲(chǔ)一個(gè)值,在聲明存儲(chǔ)屬性時(shí),可以為其設(shè)置一個(gè)默認(rèn)值,也可以在構(gòu)造示例是進(jìn)行值的設(shè)置,屬性可以通過(guò)點(diǎn)語(yǔ)法來(lái)訪問(wèn),結(jié)構(gòu)體的存儲(chǔ)屬性示例代碼如下:

?
1
2
3
4
5
6
7
struct MyStruct {
  var property1 = 1
  var property2:Int
}
var obj = MyStruct(property1: 1, property2: 2)
//通過(guò)點(diǎn)語(yǔ)法進(jìn)行屬性的訪問(wèn)
print(obj.property1,obj.property2)

如上結(jié)構(gòu)體,如果有屬性被聲明成let常量,則此屬性不能夠被修改。還有一點(diǎn)需要注意,如果在創(chuàng)建結(jié)構(gòu)體的實(shí)例時(shí),使用的是let進(jìn)行創(chuàng)建,則即便結(jié)構(gòu)體中的屬性是變量也不可進(jìn)行修改。這和類有很大區(qū)別。

還有一類存儲(chǔ)屬性叫做延時(shí)存儲(chǔ)屬性,可以設(shè)想一下這樣的情形,類的某些屬性可能并不是在每次類實(shí)例后都會(huì)用到,并且有些屬性的構(gòu)造可能會(huì)消耗大量的時(shí)間,這時(shí)一個(gè)比較聰明的設(shè)計(jì)便是在類進(jìn)行實(shí)例化時(shí),這類屬性并不被構(gòu)造,當(dāng)次類的實(shí)例使用到這個(gè)屬性時(shí),這個(gè)屬性才被構(gòu)造出來(lái),這樣的屬性被稱為延時(shí)存儲(chǔ)屬性,使用lazy關(guān)鍵字來(lái)聲明,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//第一個(gè)類
class MyClass1 {
  init(){
    print("MyClass1類被構(gòu)造")
  }
}
class MyClass2 {
  //聲明為延時(shí)存儲(chǔ)屬性
  lazy var body = MyClass1()
}
//在構(gòu)造MyClass2時(shí) 并不會(huì)進(jìn)行body屬性的構(gòu)造 不會(huì)有打印信息
var obj2 = MyClass2()
//執(zhí)行下面代碼后 會(huì)有打印信息 使用body屬性使得body被構(gòu)造
obj2.body

注意,如果在多個(gè)線程中對(duì)延時(shí)構(gòu)造屬性進(jìn)行使用,不能保證其只被構(gòu)造一次。

三、計(jì)算屬性

簡(jiǎn)單的理解,計(jì)算屬性并不是獨(dú)立的用于存儲(chǔ)值的屬性,開(kāi)發(fā)者甚至可以將其理解為一個(gè)計(jì)算方法,其主要用于通過(guò)計(jì)算來(lái)獲取或者設(shè)置其他存儲(chǔ)屬性的值。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Circle {
  //圓心
  var center:(Double,Double)
  //半徑
  var r:Double
  //周長(zhǎng) 將其作為計(jì)算屬性
  var l:Double{
    get{
      //計(jì)算圓的周長(zhǎng)
      return 2.0*r*M_PI
    }
    set{
      //通過(guò)周長(zhǎng)重新計(jì)算半徑 默認(rèn)傳入的參數(shù)名為newValue
      r = newValue/(M_PI*2)
    }
  }
}
var circle = Circle(center: (0,0), r: 2)
print(circle.l)
circle.l=24
print(circle.r)

通過(guò)上面的演示代碼可以了解,l屬性并非是一個(gè)新的屬性,只是通過(guò)r屬性來(lái)計(jì)算出l,或者通過(guò)l來(lái)反推出r,其中有一點(diǎn)需要注意,計(jì)算屬性中可以創(chuàng)建兩個(gè)代碼塊set和get,set代碼塊是可選的,其中會(huì)默認(rèn)生成一個(gè)newValue參數(shù)來(lái)傳遞外界傳進(jìn)來(lái)的數(shù)據(jù),get代碼塊是必須要實(shí)現(xiàn)的,當(dāng)然也可以只實(shí)現(xiàn)get代碼塊,這時(shí)這個(gè)屬性將是只讀的計(jì)算屬性,只可以獲取,不能夠設(shè)置。還有一點(diǎn)需要注意,開(kāi)發(fā)者也可以在set代碼塊后面自定義一個(gè)參數(shù)名來(lái)接收外界傳入的參數(shù),示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Circle {
  //圓心
  var center:(Double,Double)
  //半徑
  var r:Double
  //周長(zhǎng) 將其作為計(jì)算屬性
  var l:Double{
    get{
      //計(jì)算圓的周長(zhǎng)
      return 2.0*r*M_PI
    }
    set(newL){
      //通過(guò)周長(zhǎng)重新計(jì)算半徑 默認(rèn)傳入的參數(shù)名為newValue
      r = newL/(M_PI*2)
    }
  }
}

只讀的計(jì)算屬性可以進(jìn)行進(jìn)一步的簡(jiǎn)寫(xiě),因?yàn)闆](méi)有了set代碼塊,所以關(guān)鍵字get和括號(hào)也可以給省略掉,不會(huì)產(chǎn)生歧義,示例如下:

?
1
2
3
4
5
6
7
struct Point {
  var x:Double
  var y:Double
  var center:(Double,Double){
    return (x/2,y/2)
  }
}

四、屬性監(jiān)聽(tīng)器

Swift中的計(jì)算屬性中的get和set方法和Objective-C中的get和set方法其實(shí)并非是一回事,Objective-C提供set和get方法可以讓開(kāi)發(fā)者在屬性將要獲取或者設(shè)置的時(shí)候來(lái)進(jìn)行一些自定義的操作,這部分的開(kāi)發(fā)需求在Swift中通過(guò)屬性監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn)。

屬性監(jiān)聽(tīng)器有willSet和didSet兩種,willSet在屬性值將要變化時(shí)執(zhí)行,didSet在屬性值已經(jīng)變化時(shí)執(zhí)行,并且其中會(huì)傳入變化前后的值。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Point {
  var x:Double
  var y:Double{
    willSet{
      print("將要進(jìn)行值的更新設(shè)置,新的值是:",newValue)
    }
    didSet{
      print("已經(jīng)進(jìn)行值得更新設(shè)置,舊的值是:",oldValue)
    }
  }
  var center:(Double,Double){
    return (x/2,y/2)
  }
}
var point = Point(x: 3, y: 3)
//將打印
/*
 將要進(jìn)行值的更新設(shè)置,新的值是: 4.0
 已經(jīng)進(jìn)行值得更新設(shè)置,舊的值是: 3.0
 */
point.y=4

willSet中默認(rèn)會(huì)生成一個(gè)命名為newValue的參數(shù),didSet中會(huì)默認(rèn)生成一個(gè)命名為oldValue的參數(shù),也可以自定義這些參數(shù)的命名,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Point {
  var x:Double
  var y:Double{
    willSet(new){
      print("將要進(jìn)行值的更新設(shè)置,新的值是:",new)
    }
    didSet(old){
      print("已經(jīng)進(jìn)行值得更新設(shè)置,舊的值是:",old)
    }
  }
  var center:(Double,Double){
    return (x/2,y/2)
  }
}

五、實(shí)例屬性與類型屬性

實(shí)例屬性是針對(duì)與一個(gè)類型的實(shí)例,類型屬性則是直接針對(duì)與類型。  每對(duì)類型進(jìn)行一次實(shí)例化,其實(shí)例都有一套獨(dú)立的實(shí)例屬性,而類型屬性則是類的所有實(shí)例所共用的,在Objective-C中,通常使用全局的屬性來(lái)實(shí)現(xiàn)這樣的效果,在Swift中,使用static關(guān)鍵字來(lái)聲明類型屬性,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Point {
  //類型存儲(chǔ)屬性
  static var name:String = "Point"
  //類型計(jì)算屬性
  static var subName:String{
    return "sub"+name
  }
  var x:Double
  var y:Double{
    willSet(new){
      print("將要進(jìn)行值的更新設(shè)置,新的值是:",new)
    }
    didSet(old){
      print("已經(jīng)進(jìn)行值得更新設(shè)置,舊的值是:",old)
    }
  }
  var center:(Double,Double){
    return (x/2,y/2)
  }
}
//類型屬性 通過(guò)類型點(diǎn)語(yǔ)法來(lái)獲取
print(Point.name,Point.subName)

注意,有一種特殊的情況是針對(duì)于類的類型計(jì)算屬性,如果其需要子類進(jìn)行繼承重寫(xiě),需要將static關(guān)鍵字,換成class關(guān)鍵字,示例如下:

?
1
2
3
4
5
6
7
8
9
10
class SomeClass {
  static var storedTypeProperty = "Some value."
  static var computedTypeProperty: Int {
    return 27
  }
  //支持子類進(jìn)行重寫(xiě)的計(jì)算屬性
  class var overrideableComputedTypeProperty: Int {
    return 107
  }
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.com国产精品 | 51色视频| 色人阁导航 | 欧美a级大胆视频 | www.99热视频| 欧美韩国日本在线 | 香蕉成人在线视频 | 欧美在线成人影院 | 在线观看国产www | 依依成人综合 | 亚洲精品午夜视频 | 日本aaaa片毛片免费观看视频 | 狠狠操精品视频 | 最新一区二区三区 | 成人情欲视频在线看免费 | 欧美特黄a | 极品大长腿啪啪高潮露脸 | 国产精品自拍片 | 国产一区二区不卡 | 欧美成人免费一级 | 久久国产综合视频 | 视频一区二区在线播放 | 精品国产一区二区三区四 | 欧美亚洲国产一区 | 色七七网站 | 天天鲁在线视频免费观看 | 精品久久一区二区 | 韩国美女一区 | 一级在线免费观看视频 | 中文字幕在线播放不卡 | 密室逃脱第一季免费观看完整在线 | 免费观看一级 | 色戒在线版 | 日本韩国欧美一级片 | 午夜精品成人一区二区 | 一级做a爰性色毛片免费1 | 欧美一区二区黄 | 成人久久久精品国产乱码一区二区 | av电影免费观看 | 亚洲视频在线一区二区 | 免费一级特黄欧美大片勹久久网 |