閉包
類似於 OC 中的 Block,是一段預先定義好的程式碼,在需要時執行
閉包表示式格式:
{ (形參名稱1: 形參型別1, 形參名稱2: 形參型別2, ...) -> 返回值 `in`
//要執行的程式碼
}
in
用於區分閉包定義和程式碼實現 //定義有引數a的閉包
let coluse = { (a:String)->Void in
print("xxxxx\(a)")
}
//定義無引數的閉包
let coluse1 = {
}
let coluse2 = {()->Void in
let coluse = { (a:String)->Void in
print("xxxxx\(a)")
}
//定義無引數的閉包
let coluse1 = {
}
let coluse2 = {()->Void in
}
// 尾隨閉包
// 當閉包是最後一個引數的時候, 將閉包放在引數整個()外面
UIView.animateWithDuration(0, animations: { () -> Void in
print("aa")
// 當閉包是最後一個引數的時候, 將閉包放在引數整個()外面
UIView.animateWithDuration(0, animations: { () -> Void in
print("aa")
})
閉包使用場景(回撥)
//1.定義閉包
let cal = {(result:String)->Void in
print("閉包的引數是\(result)")
}
//呼叫方法
loadDate(cal)
let cal = {(result:String)->Void in
print("閉包的引數是\(result)")
}
//呼叫方法
loadDate(cal)
}
//2.建立方法,閉包callback:(String)->Void作為方法的引數
func loadDate(callback:(String)->Void) ->Void{
//非同步
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
//睡2秒
NSThread.sleepForTimeInterval(2)
//回到主執行緒
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//設定回撥的引數
let callString = "什麼鬼"
//3.呼叫回撥
callback(callString)
})
}
//2.建立方法,閉包callback:(String)->Void作為方法的引數
func loadDate(callback:(String)->Void) ->Void{
//非同步
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
//睡2秒
NSThread.sleepForTimeInterval(2)
//回到主執行緒
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//設定回撥的引數
let callString = "什麼鬼"
//3.呼叫回撥
callback(callString)
})
}
}
定義類
- ( )裡面是空,表示呼叫類的預設建構函式 = [[類名 alloc] init];
- 例項化一個類:
var 變數名 = 類名()
class 類名: 父類名 {
//: 一些屬性
//: 一些方法
}
注意:
1.Swift的繼承和OC一樣是通過:, Swift也只有單繼承
2.訪問類的屬性和呼叫類的方法都是通過.來進行的
3.覆蓋父類方法, 需要加關鍵字 override
類的屬性
-
OC
中的屬性:
-
-
@property(noatomic, copy) NSString *name;
1.在.h宣告 getter 和 setter 方法
2.在.m實現 getter 和 setter 方法
3.在.m生成 _成員變數
-
-
Swift
中屬性分為:儲存型屬性
和計算型屬性
儲存型屬性
: 儲存資料
-
-
屬性監視器
: 當儲存型屬性發生改變的時候,通知我們屬性發生了改變,可用於監視值的改變willSet
: 在屬性將要發生改變時呼叫didSet
: 在屬性已經發生改變時呼叫(常用)
-
計算型屬性
: 不儲存任何資料,只生成 getter
和 setter
,當只提供 get
方法時,稱之為只讀計算屬性.必須要有 get
方法
-
-
計算型屬性
相當於OC
中的@property
生成的getter
和setter
方法,只不過setter
方法沒有給_成員變數
賦值
-
// 儲存型屬性: 專門負責儲存資料的
/*
儲存型屬性有屬性監視器:監視值的改變
1.willSet: 值在改變前呼叫,瞭解,一般用不到
2.didSet: 值改變後呼叫, 這個用的多,如重新整理列表資料
*/newValue表示之前的值
var name: String = "liudehua" {
willSet {
print("值改變前: \(newValue)")
}
didSet {
print("值改變後: \(name)")
}
}
// 計算型屬性: 提供get和set方法,裡面寫什麼程式碼根據業務需求來
// 當計算性屬性,只提供get方法時,成為只讀計算性屬性,不能只有set沒有get
var nikeName: String {
get {
return "hehe"
}
set {
// newValue就是外面設定的值
print("別人設定了 nikeName 屬性,值為 \(newValue)")
}
}
建構函式
作用:在物件例項化過程中給所有的儲存型屬性設定初始值,並且執行必要的準備和初始化任務.
便利建構函式
-
- 便利建構函式: 它是輔助性的建構函式.方便建立物件
- 預設情況下,所有的建構函式都是指定建構函式
Designated
convenience
關鍵字修飾的構造方法就是便利建構函式- 便利建構函式可以返回
nil
- 需要呼叫本類的一個指定建構函式
建構函式小結
-
- 1.不需要func關鍵字.名稱是固定的,都叫 init
- 2.如果子類沒有實現建構函式.會繼承父類的建構函式
- 3.子類建構函式需要呼叫父類建構函式
- 4.需要先初始化子類屬性,在呼叫父類建構函式
- 5.子類一旦實現了建構函式.就不會繼承父類的建構函式
// 建構函式給屬性賦值
// 建構函式,先給自己的屬性賦值,在呼叫父類的建構函式
override init() {
self.name = "liudehua"
super.init()
}
// 過載: 函式名稱一樣,但是引數不一樣
init(name: String) {
// 先給自己的屬性賦值
self.name = name
super.init()
// 建構函式,先給自己的屬性賦值,在呼叫父類的建構函式
override init() {
self.name = "liudehua"
super.init()
}
// 過載: 函式名稱一樣,但是引數不一樣
init(name: String) {
// 先給自己的屬性賦值
self.name = name
super.init()
}
//子類與父類不能有相同名字的屬性,但是不是繼承關係的兩個類可以有相同名字的屬性和方法
//便利建構函式
convenience init?(stu_name:String,stu_grade:Float){
if stu_grade < 0 || stu_grade > 100{
print("非人類分數")
return nil
}
//需要呼叫自身的指定建構函式或便利建構函式,不能呼叫父類的
self.init(name:stu_name,grade:stu_grade)
}
convenience init?(s_name:String,s_grade:Float){
//呼叫自身的便利建構函式
self.init(stu_name:s_name,stu_grade:s_grade)
convenience init?(stu_name:String,stu_grade:Float){
if stu_grade < 0 || stu_grade > 100{
print("非人類分數")
return nil
}
//需要呼叫自身的指定建構函式或便利建構函式,不能呼叫父類的
self.init(name:stu_name,grade:stu_grade)
}
convenience init?(s_name:String,s_grade:Float){
//呼叫自身的便利建構函式
self.init(stu_name:s_name,stu_grade:s_grade)
}
懶載入
// 懶載入方式1
lazy var person: Person = Person(name: "小強", age: 20)
lazy var arr: NSArray = NSArray()
// 懶載入方式2(完整寫法)
lazy var person2: Person = { () -> Person in
let p = Person(name: "強強", age: 22)
return p
}()
//(預設寫法)除了建立物件,還可以做一些初始化操作
lazy var person2: Person = {
let p = Person(name: "強強", age: 22)
// 此處來1000行程式碼
let p1 = NSArray()
return p
lazy var person: Person = Person(name: "小強", age: 20)
lazy var arr: NSArray = NSArray()
// 懶載入方式2(完整寫法)
lazy var person2: Person = { () -> Person in
let p = Person(name: "強強", age: 22)
return p
}()
//(預設寫法)除了建立物件,還可以做一些初始化操作
lazy var person2: Person = {
let p = Person(name: "強強", age: 22)
// 此處來1000行程式碼
let p1 = NSArray()
return p
}()
待續。。。