本文接著上一篇清焕,對(duì)Swift的結(jié)構(gòu)體、類(lèi)祭犯、協(xié)議秸妥、擴(kuò)展、枚舉以及閉包做一個(gè)簡(jiǎn)單的介紹沃粗。
七粥惧、結(jié)構(gòu)體
Swift的結(jié)構(gòu)體對(duì)比OC來(lái)說(shuō),可以添加初始化方法最盅、可以遵守代理協(xié)議突雪。
結(jié)構(gòu)體的聲明
格式:
struct + 結(jié)構(gòu)體的名字 + {
聲明成員變量(屬性和方法)
}
聲明一個(gè)結(jié)構(gòu)體
struct Trainee {
//存儲(chǔ)屬性: 僅僅做儲(chǔ)存值的作用
var name : String
var gender : String
var height : Float
var weight : Float
//計(jì)算屬性: 通過(guò)計(jì)算獲得自己的值
//設(shè)置屬性的set和get方法
//屬性里面的set方法不能單獨(dú)存在起惕,必須有一個(gè)同屬性的get方法存在之后才可以寫(xiě)set方法
var bmi : Float {
get{
return weight / (height * height)
}
set{
self.bmi = newValue
}
}
//結(jié)構(gòu)體屬性
//結(jié)構(gòu)體屬性不能在普通的函數(shù)里面去調(diào)用
// static var condition : String? = nil
static var condition : String = "正常"
//init函數(shù)
init(name newName : String, gender newGender : String, height newHeight : Float, weight newWeight : Float) {
self.name = newName //函數(shù)內(nèi)部使用內(nèi)部參數(shù)名,不能使用外部參數(shù)名
self.gender = newGender
self.height = newHeight
weight = newWeight //如果不加self. 會(huì)默認(rèn)為 self.weight
}
//Swift的結(jié)構(gòu)體可以任意地創(chuàng)建函數(shù)
//成員方法(普通的函數(shù))
func heheda() {
print("成員方法")
}
//如果需要在函數(shù)里面修改屬性的值的話(huà)咏删,需要在函數(shù)前面添加mutating關(guān)鍵字修飾
mutating func change() {
self.name = "??"
}
//結(jié)構(gòu)體的類(lèi)方法(結(jié)構(gòu)體函數(shù)) 比成員方法多了static的修飾
static func introduce() {
self.name = "猿"
print(self.name)
}
//結(jié)構(gòu)體函數(shù)里面不能調(diào)用普通的屬性
//結(jié)構(gòu)體函數(shù)里面可以調(diào)用結(jié)構(gòu)體屬性
//結(jié)構(gòu)體函數(shù)里面可以調(diào)用一些本結(jié)構(gòu)體存在的屬性
static var talent : String? = nil
static func talentEvaluate(){
introduce()
self.talent = "Du bist nicht dumm"
print(talent)
//print(self.talent) //這兩行打印效果一樣
}
}
構(gòu)造結(jié)構(gòu)體的兩種方式
var trainee : Trainee = Trainee.init(name: "Sven", gender: "male", height: 1.86, weight: 66)
print(trainee.bmi)
print(trainee.name)
var trainee1 : Trainee = Trainee(name: "Sven", gender: "male", height: 1.86, weight: 66)
print(trainee1.bmi)
調(diào)用結(jié)構(gòu)體的成員方法
trainee.change()
print(trainee.name)
結(jié)構(gòu)體的類(lèi)方法用類(lèi)名調(diào)用
Trainee.introduce()
Trainee.talentEvaluate()
八惹想、類(lèi)
Swift中用class來(lái)定義類(lèi)
格式: class 關(guān)鍵字 + 類(lèi)名 { 類(lèi)的實(shí)現(xiàn) }
class Person {
//在類(lèi)里面創(chuàng)建一個(gè)屬性的時(shí)候,必須有初值督函,如果不想設(shè)置初值嘀粱,那么就設(shè)置成可選類(lèi)型
var name : String? = nil
var age : Int? = nil
//private修飾的屬性是私有屬性
private var gender : String? = nil
//static修飾的屬性是類(lèi)屬性
static var hobby : String? = nil
init(name newName : String, age newAge : Int){
name = newName
age = newAge
}
//實(shí)例方法里面不能直接調(diào)用類(lèi)屬性
//實(shí)例方法可以直接對(duì)實(shí)例對(duì)象進(jìn)行修改賦值
func sayGender(){
self.gender = "女"
print(self.gender)
}
//在函數(shù)聲明之前添加一個(gè)private 表示私有方法
private func showGender(){
self.gender = "女"
print(self.gender)
}
//static修飾的是類(lèi)方法
//static修飾的類(lèi)方法是不可以被子類(lèi)重寫(xiě)的
static func sayHobby() {
self.hobby = "hiking"
print(self.hobby)
}
//class修飾的也是類(lèi)方法
//class修飾的類(lèi)方法可以被子類(lèi)重寫(xiě)
class func showHobby() {
self.hobby = "Mounting"
print(self.hobby)
}
}
let person : Person = Person(name: "Silvia", age: 22)
person.sayGender()
person.showGender()
Person.sayHobby()
Person.showHobby()
class Designer: Person {
//如果想在子類(lèi)中重寫(xiě)父類(lèi)方法要加override修飾
override init(name newName: String, age newAge: Int) {
super.init(name: newName, age: newAge)
}
//這樣會(huì)報(bào)錯(cuò):
// override static func sayHobby() {
// }
override class func showHobby() {
}
}
九、協(xié)議
Swift里面協(xié)議中方法必須全部實(shí)現(xiàn) OC有必須實(shí)現(xiàn)的方法和選擇性實(shí)現(xiàn)的方法
格式:
protocol關(guān)鍵字 + 協(xié)議名字
protocol myDelegate{
//協(xié)議方法前面添加mutating修飾的關(guān)鍵字之后辰狡,可以修改結(jié)構(gòu)體里面的參數(shù)锋叨,在類(lèi)里面會(huì)自動(dòng)地忽略mutating
mutating func letsGo()
// func keepMoving() -> String
}
//如果有需要可選實(shí)現(xiàn)的協(xié)議
//在最前面添加 @objc 修飾,內(nèi)部的方法用optional修飾可選實(shí)現(xiàn)的方法宛篇,其他的不變 (這樣變成了OC的協(xié)議)
@objc protocol newDelegate{
optional func heheda()
}
//如果一個(gè)類(lèi)既有父類(lèi)又遵守了某個(gè)協(xié)議娃磺,那么格式是
//class + 類(lèi)名:父類(lèi),協(xié)議名字 如果有多個(gè)協(xié)議些己,協(xié)議之間用逗號(hào)隔開(kāi)
class Engineer: Person, myDelegate, newDelegate {
func letsGo() {
}
}
class newClass: myDelegate {
func letsGo() {
}
}
//結(jié)構(gòu)體可以遵守協(xié)議
//但是結(jié)構(gòu)體只能遵守Swift的協(xié)議
struct newStruct : myDelegate {
var name : String
mutating func letsGo() {
self.name = "Stuttgart"
}
}
十豌鸡、擴(kuò)展
extension可以給一個(gè)類(lèi)添加新的方法,但不可以添加新的屬性
extension + 類(lèi)名(結(jié)構(gòu)體名字)可以對(duì)一個(gè)類(lèi)和結(jié)構(gòu)體擴(kuò)展方法
extension可以多次對(duì)一個(gè)類(lèi)進(jìn)行擴(kuò)展段标,也可以給一個(gè)類(lèi)擴(kuò)展協(xié)議方法
extension newStruct{
func park(){
print("park now")
}
}
let somebody = newStruct(name: "Silvia")
somebody.park()
extension可以給一個(gè)類(lèi)拓展新的協(xié)議
//先聲明一個(gè)名為MyProtocol的協(xié)議
@objc protocol MyProtocol {
optional func test1() //
func test2()
}
extension Engineer : MyProtocol {
@objc func test2() {
print("擴(kuò)展新的協(xié)議")
}
}
let engineer = Engineer(name: "Lorraine", age: 22)
engineer.test2()
十一涯冠、枚舉
Swift的枚舉沒(méi)有默認(rèn)的0,1逼庞,2蛇更,3...
enum animal{
case cat
case tiger
case dog
case horse
}
//使用枚舉的時(shí)候,初次給變量賦值赛糟,必須使用枚舉名.case名
var animal1 = animal.cat
//第二次使用的時(shí)候派任,可以直接通過(guò).case名使用
animal1 = .horse
switch搭配枚舉使用
switch的value要填寫(xiě)一個(gè)枚舉類(lèi)型的實(shí)例變量
case .枚舉的case名字
switch animal1 {
case .cat: //沒(méi)代碼提示,較容易出錯(cuò)
print("貓")
case .tiger:
print("虎")
case .dog:
print("??")
case .horse:
print("??")
}
十二璧南、閉包
閉包是自包含的函數(shù)代碼塊掌逛,可以在代碼中被傳遞和使用。
Swift中的閉包相當(dāng)于C和OC中的block代碼塊司倚,與其他一些編程語(yǔ)言中的匿名函數(shù)比較相似豆混。(另:拆包是可選類(lèi)型,與閉包不是一回事)
閉包可以捕獲和存儲(chǔ)其所在上下文中任意常量和變量的引用动知。這就是所謂的閉合并包裹著這些常量和變量皿伺,俗稱(chēng)閉包。Swift會(huì)管理在捕獲過(guò)程中涉及到的所有內(nèi)存操作盒粮。
閉包表達(dá)式格式:
閉包名字: ((參數(shù)) -> 返回值類(lèi)型)
var newPassValue : ((a : Int, b : Int ) -> Int)
閉包有5種寫(xiě)法
//第一種閉包表達(dá)式的寫(xiě)法 (最全的寫(xiě)法)
newPassValue = { (a : Int, b : Int) -> Int in
return a > b ? a : b
}
//第二種寫(xiě)法 這是蘋(píng)果推薦的寫(xiě)法
newPassValue = { (a , b) -> Int in
return a > b ? a : b
}
//第三種寫(xiě)法
newPassValue = {
$0 > $1 ? $0 : $1
}
//第四種寫(xiě)法
newPassValue = { (a , b) in
return a > b ? a : b
}
//第五種寫(xiě)法 (省略?xún)?nèi)容最多的一種)
newPassValue = { (a , b) in
a > b ? a : b
}