本片文字主要介紹: 結(jié)構(gòu)體 類(lèi) 協(xié)議 擴(kuò)展 閉包
結(jié)構(gòu)體
// 聲明結(jié)構(gòu)體的格式: struct + 結(jié)構(gòu)體名字 + {聲明成員變量等}
struct Frame {
// 存儲(chǔ)屬性: 僅僅做存儲(chǔ)值的作用
var x : Float
var y : Float
var width : Float
var height : Float
// 計(jì)算屬性: 通過(guò)計(jì)算獲取自己的值
// 設(shè)置屬性的get和set方法
// 屬性里面的set方法不能單獨(dú)存在,必須有一個(gè)同屬性的get方法存在之后才可以寫(xiě)set
var centerX : Float {
get{
return x + width / 2
}
set{
self.centerX = newValue
}
}
var centerY : Float {
get{
return y + height / 2
}
set{
self.centerY = newValue
}
}
// 在Swift的結(jié)構(gòu)體里面可以創(chuàng)建一個(gè)init方法 x外部參數(shù)名 newX內(nèi)部參數(shù)名
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
}
// Swift的結(jié)構(gòu)體內(nèi)可以任意創(chuàng)建函數(shù)
// 如果需要在函數(shù)里面修改屬性值的話,需要在函數(shù)前面添加mutating關(guān)鍵字修持
mutating func haha() {
self.x = 100
}
// 結(jié)構(gòu)體屬性
// 結(jié)構(gòu)體屬性是不能在普通的函數(shù)里面去調(diào)用的
static var name : String? = nil
// 結(jié)構(gòu)體函數(shù)
// 結(jié)構(gòu)體函數(shù)里不能調(diào)用普通的屬性
// 結(jié)構(gòu)體函數(shù)里可以調(diào)用結(jié)構(gòu)體屬性
// 結(jié)構(gòu)體函數(shù)里可以調(diào)用一些本結(jié)構(gòu)體存在的函數(shù)
static func sayName() {
self.name = "我是一個(gè)frame"
print(self.name)
}
}
// 調(diào)用方法一
let frame : Frame = Frame.init(x: 10, y: 20, width: 30, height: 40)
print(frame.centerX, frame.centerY)
// 調(diào)用方法二
let frame1 : Frame = Frame(x: 100, y: 100, width: 100, height: 100)
print(frame1.centerX, frame1.centerY)
// 調(diào)用結(jié)構(gòu)體函數(shù), 必須要通過(guò)結(jié)構(gòu)體去調(diào)用
Frame.sayName()
類(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 county : 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 表示私有方法
private func sayHi() {
self.gender = "女"
print(self.gender)
}
// static修飾的是類(lèi)方法
// static修飾的類(lèi)方法是不可以被子類(lèi)重寫(xiě)的
static func sayHello() {
self.county = "中國(guó)"
print(self.county)
}
// class修飾的也是類(lèi)方法
// class修飾的類(lèi)方法可以被子類(lèi)重寫(xiě)
class func sayNihao() {
self.county = "china"
print(self.county)
}
}
// 賦值調(diào)用
let person : Person = Person.init(name: "八戒", age: 30)
//let person : Person = Person(name: "八戒", age: 30)
print(person.name,person.age)
person.sayHi()
Person.sayHello()
Person.sayNihao()
// 繼承
class Student: Person {
// 如果子類(lèi)想重寫(xiě)父類(lèi)的方法,需要加override修飾
override init(name newName: String, age newAge: Int) {
super.init(name: newName, age: newAge)
}
// self.sayHhi() // 不能調(diào)用父類(lèi)私有方法
// 重寫(xiě)類(lèi)方法
override class func sayNihao() {
}
}
協(xié)議
// 格式 protocol(關(guān)鍵字) + 協(xié)議名字
// Swift協(xié)議里的方法必須實(shí)現(xiàn)
protocol myDelegate {
// 協(xié)議方法前面添加mutating修持的關(guān)鍵字之后, 可以修改結(jié)構(gòu)體里面的參數(shù),
mutating func hehehe()
}
// 如果有需要可選實(shí)現(xiàn)的協(xié)議,在最前面添加 @objc 修飾,內(nèi)部的方法用optional修飾可選實(shí)現(xiàn)的方法,其他的不變 (OC的協(xié)議)
@objc protocol newDelegate {
optional func lalala()
}
// 如果一個(gè)類(lèi)即有父類(lèi), 也遵守了某個(gè)協(xié)議, 那么格式是: class + 類(lèi)名:父類(lèi), 協(xié)議名
class Teacher : Person, myDelegate, newDelegate{
func hehehe(){
}
}
// 如果沒(méi)有父類(lèi),可直接遵守協(xié)議
class newClass : myDelegate {
func hehehe() {
}
}
// 結(jié)構(gòu)體可以遵守協(xié)議 但是結(jié)構(gòu)體只能遵守Swift的協(xié)議
struct newStruct : myDelegate {
var name : String
mutating func hehehe() {
self.name = "asd"
}
}
擴(kuò)展
// 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é)議方法
// 給類(lèi)擴(kuò)展一個(gè)新方法
extension Person {
func eat() {
print("吃飯")
}
// extension不可以添加新的屬性
// var height : Float? = nil
}
// 調(diào)用
person.eat()
枚舉
enum time {
case spring
case summer
case autumn
case winter
}
// 使用枚舉的時(shí)候,初次給變量賦值,必須使用 枚舉名.case名
var timer = time.autumn
// 第二次使用的時(shí)候 可以直接通過(guò) .case名 使用
timer = .spring
// switch 搭配枚舉使用
// switch 的value 要填一個(gè)枚舉類(lèi)型的實(shí)例變量
// case .枚舉的case名字
switch timer {
case .spring:
print("春天")
case .summer:
print("夏天")
case .autumn:
print("秋天")
case .winter:
print("冬天")
}
閉包
// 閉包是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用. Swift中的閉包與OC中的代碼塊(block)以及其他一些編程語(yǔ)言中的匿名函數(shù)比較相似
// 閉包可以捕獲和存儲(chǔ)其上下文中任意常量和變量的引用. 這就是所謂的閉合并包裹著這些常量和變量,俗稱(chēng)閉包. Swift會(huì)為你管理在捕獲過(guò)程中涉及到的所有內(nèi)存操作
// 注意: 閉包的函數(shù)體部分由關(guān)鍵字in引入. 該關(guān)鍵字表示閉包的參數(shù)和返回值類(lèi)型定義已經(jīng)完成, 閉包函數(shù)體即將開(kāi)始
// 閉包格式 名字 : ((參數(shù)) -> 返回值類(lèi)型)
var newPassValue : ((a : Int, b : Int) -> Int)
// 第一種寫(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ě)法 $0:第一個(gè)參數(shù) $1:第二個(gè)參數(shù) 以此類(lèi)推
newPassValue = {
$0 > $1 ? $0 : $1
}
// 第四種寫(xiě)法
newPassValue = { (a, b) in
return a > b ? a : b
}
// 第五種寫(xiě)法
newPassValue = { (a, b) in
a > b ? a : b
}
print(newPassValue(a: 3,b: 8))