介紹:Swift 語言由蘋果公司在 2014 年推出津函,用來撰寫 Mac OS 和 iOS 應(yīng)用程序帚桩,并且Swift還是開源的,開源地址:https://github.com/apple/swift,同時(shí)附上官方博客地址:https://swift.org
目前Swift已經(jīng)發(fā)展到了第五版本芦昔。顯然蘋果大有推翻 OC “江山”的意思.
今天就來初探一下Swift,看看究竟為何swift有這么大的能力娃肿。
參考內(nèi)容:
Swift中文
YungFan老師
一咕缎、屬性相關(guān)使用
1. 存儲(chǔ)屬性
- 存儲(chǔ)屬性只能由
類
和結(jié)構(gòu)體
定義。 - 存儲(chǔ)屬性和計(jì)算屬性通常和特定類型的實(shí)例相關(guān)聯(lián)料扰。
- 存儲(chǔ)屬性要么是變量存儲(chǔ)屬性(由
var
關(guān)鍵字引入)要么是常量存儲(chǔ)屬性(由let
關(guān)鍵字引入)凭豪。
// 存儲(chǔ)屬性
class className {
let name = "Swift"
var sex = "男"
var age = 23
}
當(dāng)中的 name sex age都是存儲(chǔ)屬性 ,一般情況下用 var
關(guān)鍵字定義計(jì)算屬性——包括只讀計(jì)算屬性——為變量屬性晒杈,因?yàn)樗鼈兊闹挡皇枪潭ǖ?/code>嫂伞。
2. 讀取和設(shè)置存儲(chǔ)屬性
通過點(diǎn)語法實(shí)現(xiàn)
- 當(dāng)定義的屬性用 let 修飾 那么為不可變的 就 不可以給其賦值
- 在結(jié)構(gòu)體實(shí)例化的時(shí)候 如果用 let 修飾 那么,其所有的屬性都不可以進(jìn)行賦值操作, 不論實(shí)現(xiàn)是用 let 還是 var 修飾的
// 實(shí)例化對(duì)象
let swiftName = className()
//swiftName.name = "123"
swiftName.sex = "女"
print(swiftName.sex) // 女
// 結(jié)構(gòu)體
struct structName{
var name = "swift"
var sex = "男"
}
// 用 let 修飾
let otherSwiftName = structName(name: "Swift", sex: "21")
//otherSwiftName.name = "123" // 會(huì)報(bào)錯(cuò)!
3. 延遲存儲(chǔ)屬性 懶加載屬性
- 延遲存儲(chǔ)屬性的初始值在其第一次使用時(shí)才進(jìn)行計(jì)算帖努。
- 你可以通過在其聲明前標(biāo)注
lazy
修飾語來表示一個(gè)延遲存儲(chǔ)屬性撰豺。 - OC中通過重寫getter方法去實(shí)現(xiàn)
- 你必須把延遲存儲(chǔ)屬性聲明為變量(
使用 var 關(guān)鍵字
),因?yàn)樗某跏贾悼赡茉趯?shí)例初始化完成之前無法取得拼余。常量屬性則必須在初始化完成之前有值污桦,因此不能聲明為延遲。
class className2 {
let name = "Swift"
lazy var sex = "男"
var age = 23
}
print(className2())
注意: lazy修飾的屬性 同時(shí)被多個(gè)線程訪問并且屬性還沒有被初始化姿搜,則無法保證屬性只初始化一次寡润。
4. 計(jì)算屬性
計(jì)算屬性實(shí)際并不存儲(chǔ)值。相反舅柜,他們提供一個(gè)讀取器和一個(gè)可選的設(shè)置器來間接得到和設(shè)置其他的屬性和值梭纹。
// 計(jì)算屬性
class student {
var name: String = ""
var chineseScore : Double = 0.0
var mathScore : Double = 0.0
// 計(jì)算屬性
var averageScore : Double {
get {
return (chineseScore + mathScore) / 2.0
}
// set(newAverageScore) {
// //self.averageScore = newAverageScore
// self.averageScore = newValue
// }
//簡(jiǎn)寫 set
set {
//self.averageScore = newAverageScore
self.averageScore = newValue
}
}
}
student().averageScore
let studentClass = student()
studentClass.chineseScore = 10.0
studentClass.mathScore = 12.0
print(studentClass.averageScore)
// 只讀計(jì)算屬性
class student2 {
var name: String = ""
var chineseScore : Double = 0.0
var mathScore : Double = 0.0
// 計(jì)算屬性
var averageScore : Double {
get {
return (chineseScore + mathScore) / 2.0
}
}
}
let student2Class = student2()
//student2Class.averageScore = 2;
5. 屬性觀察者
-
通過
willset
和didset
方法來實(shí)現(xiàn)-
willSet
會(huì)在該值被存儲(chǔ)之前被調(diào)用。 -
didSet
會(huì)在一個(gè)新值被存儲(chǔ)后被調(diào)用致份。
-
OC中通過重寫Setter方法實(shí)現(xiàn)
如果你實(shí)現(xiàn)了一個(gè)
willSet
觀察者变抽,新的屬性值會(huì)以常量形式參數(shù)傳遞
。你可以在你的 willSet 實(shí)現(xiàn)中為這個(gè)參數(shù)定義名字氮块。如果你沒有為它命名绍载,那么它會(huì)使用默認(rèn)的名字newValue
。同樣滔蝉,如果你實(shí)現(xiàn)了一個(gè)
didSet
觀察者击儡,一個(gè)包含舊屬性值的常量形式參數(shù)將會(huì)被傳遞。你可以為它命名蝠引,也可以使用默認(rèn)的形式參數(shù)名oldValue
阳谍。如果你在屬性自己的 didSet 觀察者里給自己賦值,你賦值的新值就會(huì)取代剛剛設(shè)置的值螃概。
6. 類型屬性
- 用
static
關(guān)鍵字來開一類型屬性 - 對(duì)于類類型的計(jì)算類型屬性矫夯,你可以使用
class
關(guān)鍵字來允許子類重寫父類的實(shí)現(xiàn)。
class SomeClass {
static var storedTypeProperty = "Some value."
// 只寫了get方法
static var computedTypeProperty: Int {
return 27
}
// 只寫了get方法
class var overrideableComputedTypeProperty: Int {
return 107
}
}
- 類型屬性在類里查詢和設(shè)置吊洼,而不是這個(gè)類型的實(shí)例训貌。
SomeClass.storedTypeProperty = "123"
SomeClass.computedTypeProperty
SomeClass.overrideableComputedTypeProperty
struct AudioChannel {
static let thresholdLevel = 10
static var maxInputLevelForAllChannels = 0
var currentLevel: Int = 0 {
didSet {
if currentLevel > AudioChannel.thresholdLevel {
// cap the new audio level to the threshold level
currentLevel = AudioChannel.thresholdLevel
}
if currentLevel > AudioChannel.maxInputLevelForAllChannels {
// store this as the new overall maximum input level
AudioChannel.maxInputLevelForAllChannels = currentLevel
}
}
}
}