當前位置:網站首頁>Swift 基礎 閉包/Block的使用(源碼)
Swift 基礎 閉包/Block的使用(源碼)
2022-06-24 08:10:31【馮漢栩】
一直覺得自己寫的不是技術,而是情懷,一個個的教程是自己這一路走來的痕迹。靠專業技能的成功是最具可複制性的,希望我的這條路能讓你們少走彎路,希望我能幫你們抹去知識的蒙塵,希望我能幫你們理清知識的脈絡,希望未來技術之巔上有你們也有我。
前言
今年2022年又用回了swift語言,4年前用過,已經很久沒有用了,會想起來還是需要時間來適應的。畢竟swift的使用比oc靈活多了,下面記錄一下我平時使用閉包的使用
之前我也oc語言使用block的文章
OC 監聽-Block/代理/通知/KVO(源碼)
和block使用容易產生循環應用的問題
OC 技術 Block循環引用的問題(視頻)(代碼)
正題
閉包最常見就是用於數據的逆傳
閉包作為屬性的使用
有值的VC
1.創建一個閉包出來
在有值的方法裏面調用閉包,把值傳遞到閉包裏面
點擊按鍵出發方法,就像網絡請求數據一樣
import UIKit
class BViewController: UIViewController {
let btn = UIButton()
// 重定義閉包類型
typealias StudentCallBlock = (_ name:String, _ age:String, _ gengder:String) -> ()
// 創建閉包屬性
var studentCallBlock:StudentCallBlock?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(btn)
btn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
btn.setTitle("pop", for: .normal)
btn.titleLabel?.font = .systemFont(ofSize: 14)
btn.setTitleColor(.white, for: .normal)
btn.backgroundColor = .orange
btn.frame = CGRect(x: 100, y: 250, width: 50, height: 50)
}
//有數據方法
private func getDate(){
let name = "juan"
let age = "12"
let gender = "gril"
//把數據傳遞到閉包裏面保存起來
studentCallBlock!(name,age,gender)//如果外面不實現閉包會崩掉
}
@objc private func btnClick() {
//模擬獲取網絡數據
getDate()
navigationController?.popViewController(animated: true)
}
}
想得到值的控制器
通過對象點出屬性可以拿到傳出來的值
import UIKit
import SnapKit
class ViewController: UIViewController {
let btn_0 = UIButton()
let btn_1 = UIButton()
let vc = BViewController()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(btn_0)
btn_0.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
btn_0.setTitle("dump", for: .normal)
btn_0.titleLabel?.font = .systemFont(ofSize: 14)
btn_0.setTitleColor(.white, for: .normal)
btn_0.backgroundColor = .orange
btn_0.frame = CGRect(x: 100, y: 250, width: 50, height: 50)
vc.studentCallBlock = { name, age, gengder in
print("studentCallBlock name: \(name), age: \(age), gengder: \(gengder),")
}
}
@objc private func btnClick() {
navigationController?.pushViewController(vc, animated: true)
}
}
閉包作為方法參數
有值的控制器
定義閉包的類型
創建一個帶閉包參數的方法,使用閉包把值傳遞出去
import UIKit
class BViewController: UIViewController {
// 重定義閉包類型
typealias StudentCallBlock = (_ name:String, _ age:String, _ gengder:String) -> ()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
}
//把Block放到方法裏面,用於外面調用得到值
func userBlock(callBlock: @escaping StudentCallBlock){
callBlock("name","age","gender")
}
}
想得到值的控制器
點擊按鍵調用對象的閉包當法,就可以得到傳遞出來的值
import UIKit
import SnapKit
class ViewController: UIViewController {
let btn_1 = UIButton()
let vc = BViewController()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(btn_1)
btn_1.addTarget(self, action: #selector(btnClick_1), for: .touchUpInside)
btn_1.setTitle("value", for: .normal)
btn_1.titleLabel?.font = .systemFont(ofSize: 14)
btn_1.setTitleColor(.white, for: .normal)
btn_1.backgroundColor = .orange
btn_1.frame = CGRect(x: 100, y: 450, width: 50, height: 50)
}
@objc private func btnClick_1() {
vc.userBlock { name, age, gengder in
print("userBlock name: \(name), age: \(age), gengder: \(gengder),")
}
}
}
閉包寫在構造函數
有時候看到一些別人的寫法,閉包寫在構造函數裏面,一般一個控制器面需要彈出一個view的選擇框,然後選擇好之後把想要的信息傳遞出來可以這麼用。
有值的控制器
定義閉包形式
在構造函數裏面,把閉包關聯起來
出發閉包的地方把值傳遞出去
import UIKit
public let kScreenWidth: CGFloat = UIScreen.main.bounds.size.width
public let kScreenHeight: CGFloat = UIScreen.main.bounds.size.height
class FloatView: UIView {
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
init(with valueBlock:((NSInteger)->())?) {
self.valueBlock = valueBlock
let targetRect = CGRect(
x: 0,
y: 0,
width: kScreenWidth,
height: kScreenHeight
)
super.init(frame: targetRect)
buildUI()
}
func showView(){
UIView.animate(withDuration: 0.5, animations: {
self.backgroundColor = .black.withAlphaComponent(0.5)
})
}
func dismissView(){
valueBlock?(1)
self.removeFromSuperview()
backgroundColor = .clear
}
private let button = UIButton()
private var valueBlock:((_ index:NSInteger)->())?
private var list = [String]()
private func buildUI(){
backgroundColor = .clear
addSubview(button)
button.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight)
button.addTarget(self, action: #selector(buttonClick), for: .touchUpInside)
}
@objc func buttonClick() {
self.dismissView()
}
}
想得到值的控制器
閉包在構造函數的參數裏面打印想得到的值
點擊按鍵把閉包的地傳遞出來
import UIKit
import SnapKit
class ViewController: UIViewController {
let btn_0 = UIButton()
let container = FloatView { index in
print("index: \(index)")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(btn_0)
btn_0.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
btn_0.setTitle("dump", for: .normal)
btn_0.titleLabel?.font = .systemFont(ofSize: 14)
btn_0.setTitleColor(.white, for: .normal)
btn_0.backgroundColor = .orange
btn_0.frame = CGRect(x: 100, y: 250, width: 50, height: 50)
view.addSubview(container)
container.showView()
}
@objc private func btnClick() {
container.dismissView()
}
}
版權聲明
本文為[馮漢栩]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/175/202206240434142177.html
邊欄推薦
猜你喜歡
隨機推薦
- 你真的理解LDO的輸出電容嗎!?
- 二維激光SLAM( 使用Laser Scan Matcher )
- MySQL使用ReplicationConnection導致的連接失效分析與解决
- Go寫文件的權限 WriteFile(filename, data, 0644)?
- 在線文本過濾小於指定長度工具
- quartus調用&設計D觸發器——仿真&時序波驗證
- 【深入理解TcaplusDB技術】TcaplusDB構造數據
- 等保備案是什麼意思?應該去哪裏辦理備案?
- 建議自查!MySQL驅動Bug引發的事務不回滾問題,也許你正面臨該風險!
- 百萬獎金等你來拿,首届中國元宇宙創新應用大賽聯合創業黑馬火熱招募中!
- 力扣解法匯總513-找樹左下角的值
- 快速排序的簡單理解
- 139. 單詞拆分
- Web篇_01 了解web開發
- ADB 按鍵名、按鍵代碼數字、按鍵說明對照錶
- leetcode:面試題 08.13. 堆箱子【自頂而下的dfs + memory or 自底而上的排序 + dp】
- 解答02:Smith圓為什麼能“上感下容 左串右並”?
- MySQL的 安裝、配置、卸載
- 【ESP8266-01s】獲取天氣,城市,北京時間
- Redis 集群
- 【華中科技大學】考研初試複試資料分享
- 傑理之串口設置好以後打印亂碼,內部晶振沒有校准【篇】
- 【NOI2014】15.起床困難綜合症【二進制】
- 函數的定義和函數的參數
- JDBC 在性能測試中的應用
- 35歲危機?內卷成程序員代名詞了…
- SQL聯合查詢(內聯、左聯、右聯、全聯)的語法
- Outlook開機自啟+關閉時最小化
- 北大、加州伯克利大學等聯合| Domain-Adaptive Text Classification with Structured Knowledge from Unlabeled Data(基於未標記數據的結構化知識的領域自適應文本分類)
- 為什麼你的數據圖譜分析圖上只顯示一個值?
- sql server常用sql
- MySQL事務隔離
- STM32-------外部中斷
- 2022年信息安全工程師考試知識點:訪問控制
- 高仿書旗小說 Flutter 版,學起來
- 工作中一些常用的工具函數
- docker 部署redis
- 如何利用數倉創建時序錶
- version `ZLIB_1.2.9‘ not found (required by /lib64/libpng16.so.16)
- 【Flutter】如何使用Flutter包和插件