(一) 結(jié)構(gòu)體
- 關(guān)鍵字 - - - - frame
1.屬性分類(lèi):在Swift語(yǔ)言中結(jié)構(gòu)體分為兩種屬性,第一種為儲(chǔ)存屬性,粗存屬性?xún)H僅是用來(lái)做存儲(chǔ)值得作用;第二種為計(jì)算屬性,計(jì)算屬性通過(guò)計(jì)算來(lái)獲取自己的值.
2.屬性的作用:
(1)聲明了setter和getter方法;
(2)實(shí)現(xiàn)了setter和getter方法;
(3)聲明了一個(gè)和此屬性同名并帶下劃線(xiàn)的成員變量;
<示例代碼如下>
struct Frame {
//在Swift中,X,Y,長(zhǎng)和寬都為存儲(chǔ)屬性
var x : Float
var y : Float
var width :Float
var height : Float
//變量屬性(重寫(xiě)getter方法和setter方法都直接寫(xiě)在變量屬性之中)
var centerX : Float {
get{
return x + width / 2
}
set{
self.centerX = newValue //newValue表示新值
} }
var centerY : Float {
get{
return y + height / 2
}
set{
self.centerY = newValue //newValue便是新值
}
}
- 注意 : 在Swift語(yǔ)法中,setter方法是不允許單獨(dú)存在的,如果想要重寫(xiě)setter方法,必須要有一個(gè)同屬性額getter方法存在之后才可以重寫(xiě)setter 方法
3.結(jié)構(gòu)體初始化方法(init方法)
外部參數(shù)名:(例如X,Y,Width,Height)
內(nèi)部參數(shù)名:(例如newX等)
<示例代碼如下>
//在Swift的結(jié)構(gòu)體里面,可以創(chuàng)建一個(gè)init方法
init(x newX : Float, y newY : Float, width newWidth : Float, height newHeight : Float) {
self.x = newX
self.y = newY
self.width = newWidth
self.height = newHeight
}
4.修改函數(shù)屬性的值
<示例代碼如下>
//在Swift結(jié)構(gòu)體函數(shù)里面修改屬性的值 要在函數(shù)前面添加mutating關(guān)鍵字修飾
mutating func daniuniu() {
self.x = 100
}
- mutating關(guān)鍵字的作用: Swift的結(jié)構(gòu)體可以任意的創(chuàng)建函數(shù),但如果需要在函數(shù)里面修改屬性的值得話(huà)需要在函數(shù)前面添加mutating關(guān)鍵字修飾
5.屬性:
(1)結(jié)構(gòu)體屬性是不能在普通的函數(shù)里面去調(diào)用的;
(2)結(jié)構(gòu)體函數(shù)里面可以調(diào)用結(jié)構(gòu)體屬性
(3)結(jié)構(gòu)體函數(shù)里面可以調(diào)用一些本結(jié)構(gòu)體內(nèi)存在的函數(shù)
<示例代碼如下>
//結(jié)構(gòu)體屬性是不能再普通的函數(shù)里面去調(diào)用的
static var name : String? = nil
//結(jié)構(gòu)體函數(shù)
static func sayName() {
self.name = "我是一個(gè)frame"
print(self.name)
}
}
6.結(jié)構(gòu)體函數(shù)調(diào)用方法
let fram :Frame = Frame.init(x: 10, y: 10, width: 10, height: 10)
print(fram.centerY, fram.centerX)
let fram1 : Frame = Frame(x: 100, y: 100, width: 100, height: 100)
print(fram1.centerX, fram1.centerY)
//調(diào)用接頭體函數(shù),必須得通過(guò)這個(gè)二結(jié)構(gòu)體去調(diào)用
Frame.sayName()
(二) 類(lèi)
- 類(lèi)的格式 : class 關(guān)鍵字 + 類(lèi)名 {類(lèi)的實(shí)現(xiàn)}
1.屬性 : 在類(lèi)里面創(chuàng)建一個(gè)屬性的時(shí)候,必須要有初值,如果不想設(shè)置初始值,那么就設(shè)置成為可選類(lèi)型(nil)
(1)私有屬性: 用private這個(gè)關(guān)鍵字來(lái)表示
(2)類(lèi)屬性:用static這個(gè)關(guān)鍵字來(lái)表示 - 注意:
1>實(shí)例方法里面不能直接調(diào)用類(lèi)屬性;但是可以直接對(duì)實(shí)例對(duì)象進(jìn)行修改賦值
2>在函數(shù)證明之前添加private表示私有方法
<實(shí)例代碼如下>
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 country : String? = nil
init(name newName : String, age newAge: Int) {
self.name = newName
self.age = newAge
}
//實(shí)例方法里面不能直接調(diào)用類(lèi)屬性
//實(shí)例方法可以直接對(duì)實(shí)例對(duì)象進(jìn)行修改賦值
//在函數(shù)聲明之前添加一個(gè)private 表示私有方法
func sayHi() {
self.gender = "男"
}
//static 修飾的是類(lèi)方法
//static 修飾的方法是不可以被子類(lèi)重寫(xiě)的
static func sayHello() {
self.country = "中國(guó)"
print(self.country)
}
//class 修飾的也是類(lèi)方法
//class 修飾的方法可以被子類(lèi)重寫(xiě)
class func sayNihao() {
self.country = "China"
print(self.country)
}
}
2.class與static修飾類(lèi)方法的區(qū)別: static修飾類(lèi)方法不可以被子類(lèi)重寫(xiě),但是class修飾的類(lèi)方法可以被子類(lèi)重寫(xiě)
< 結(jié)構(gòu)體與類(lèi)的區(qū)別 >
1.屬性:結(jié)構(gòu)體里面創(chuàng)建屬性不需要給類(lèi)型和初值,類(lèi)里面要給初始值或者可選類(lèi)型
2.類(lèi)方法重寫(xiě):結(jié)構(gòu)體里用
3.類(lèi)用class修飾,結(jié)構(gòu)體用struct
(三) 協(xié)議
- 格式 : protocol 關(guān)鍵字 + 協(xié)議名字
protocol myDelegate {
//沒(méi)有返回值的寫(xiě)法
//學(xué)一方法前面添加mutating修飾的關(guān)鍵字之后,可以修改結(jié)構(gòu)體里面的參數(shù),在類(lèi)里面會(huì)自動(dòng)的忽略mutating
mutating func daniuniu()
//有返回值的寫(xiě)法
func daniuniu() -> String
}
//如果一個(gè)類(lèi)既有父類(lèi) 也遵守了摸個(gè)協(xié)議,那么它的格式是: class + 類(lèi)名:父類(lèi),協(xié)議名字
class Teacher: Person {...}
//如果有需要可選實(shí)現(xiàn)的協(xié)議,在最前面添加@objc修飾,內(nèi)部的方法用optional修飾可選實(shí)現(xiàn)的方法,其他的不變
// @objc 是OC的協(xié)議
@objc protocol newDelegate{
optional func lalala()
}
class newClass: myDelegate,newDelegate {
func daniuniu() { ... }
}
//結(jié)構(gòu)體可以遵守協(xié)議,但是結(jié)構(gòu)體只能遵守Swift的協(xié)議,不能遵守OC的協(xié)議
struct newStudent : myDelegate {
var name : String
mutating func daniuniu() {
self.name = "niuniu"
}
}
//extension可以給一個(gè)類(lèi)拓展新的協(xié)議
extension Person :myDelegate {
func daniuniu() { ... }
//extension不可以添加新的屬性
// var height : Float? = nil
//可以給一個(gè)類(lèi)添加新的函數(shù)
func fuwei() { ... }
}
//extension 可以給一個(gè)結(jié)構(gòu)體拓展新的協(xié)議
extension Frame : myDelegate { ... }
//枚舉
enum time {
case spring
case summer
case autumn
case winter
}
//使用枚舉的時(shí)候,初次給變量賦值,必須使用枚舉名.case名
var timer = time.autumn
//第二次使用的時(shí)候 可以直接通過(guò).case名使用
timer = .spring
//switch 搭配枚舉使用
//switch 的value要填寫(xiě)一個(gè)枚舉類(lèi)型的實(shí)例變量
//case .枚舉的case名字
switch timer {
case .spring:
print("春天")
case .summer:
print("夏天")
case .autumn:
print("秋天")
case .winter:
print("冬天")
}
(四) 閉包
- 表達(dá)式 : 閉包名字: ((參數(shù)) -> 返回值類(lèi)型)
var newPassValue : ((a : Int, b : Int) -> Int)
- 閉包表達(dá)式的三種寫(xiě)法
//第一種閉包表達(dá)式的寫(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
}
newPassValue = { (a, b) in
return a > b ? a : b
}
newPassValue = {(a , b) in
a > b ? a : b
}