Swift 的四种传值方式 有 单例, 代理,闭包(oc的block),通知.
1 单例 Swift 的单例简单到怀疑他的正确性.步骤如下:(下面有具体代码)
第一步 创建 SingleTest static let shareInstance = SingleTest()
第二步 使用 SingleTest.shareInstance.getString()
第三步 验证是否唯一 let str = SingleTest.shareInstance
print(Unmanaged.passUnretained(str).toOpaque() ) // 打印内存地址
2 代理基本和oc差不多.步骤如下:(下面有具体代码)
第一步 定义协议
protocol dwDelegate {//第一步 定义协议
func changeString(newString: String)
}
第二步 声明协议
var delegate: dwDelegate? // 第二步 声明协议
第三步 触发协议
self.delegate!.changeString(newString: "hahaha") // 第三步 触发协议
第四步: 遵守协议
class ViewController: UIViewController, dwDelegate { // 第四步: 遵守协议
第五步,遵守协议
vc.delegate = self // 第五步,遵守协议
第六步: 实现协议
func changeString(newString: String) { // 第六步: 实现协议
print(newString)
}
3 闭包 具体步骤 如下 :(下面有具体代码)
第一步 定义闭包
typealias swiftBlock = (_ str: String) -> Void
第二步 声明
var callBack : swiftBlock? //第二步 声明
第三步 实现闭包
func callBackBlock(_ block: @escaping swiftBlock) { // 第三步 实现闭包
callBack = block
}
第四步 触发闭包
if callBack != nil { // 第四步 触发闭包
callBack!("闭包传值")
}
第五步 触发闭包回调
cusVC.callBackBlock { (str) in //第五步 触发闭包回调
print(str)
}
4 通知 具体步骤如下
第一步 第一步 创建通知 (用于接收通知)
let center = NotificationCenter.default
第二步 添加观察者
center.addObserver(self, selector: #selector(receiveValue(info:)), name: NSNotification.Name(rawValue: "passValue"), object: nil)
第三步 通知触发的方法
let str = info.object!
print(str)
let dic = info.userInfo! as Dictionary
print(dic["age"]!)
第四步 创建观察者(用于发送通知)
let center = NotificationCenter.default // 第四步 创建观察者(用于发送通知)
第五步 发出通知
let dic = [
"name" : "李四" ,
"sex" : "男",
"age" : "27"
]
// 第五步 发出通知
center.post(name: NSNotification.Name(rawValue: "passValue"), object: "传值", userInfo: dic)
1.单例的具体代码:
ViewController :
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
let str = SingleTest.shareInstance
print(Unmanaged.passUnretained(str).toOpaque() ) // 打印内存地址
// 单例的使用
print(SingleTest.shareInstance.getString())
//全局的一些东西.
// 登陆成功记住用户名
username = "bdgt"
print(username)
// 打印枚举
print(alldata.loginUrl.rawValue)
makeBtn()
// Do any additional setup after loading the view, typically from a nib.
}
func makeBtn() {
let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
btn.setTitle("btn", for: UIControlState.normal)
btn.backgroundColor = UIColor.lightGray
btn.addTarget(self, action: #selector(btnClick), for: UIControlEvents.touchUpInside)
self.view.addSubview(btn)
}
@objc func btnClick(){
print("ddd")
let vc = SecondViewController.init()
present(vc, animated: true, completion: nil)
}
func changeString(newString: String) { // 第六步: 遵守协议
print(newString)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
SecondViewController:
import UIKit
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let str = SingleTest.shareInstance
print(Unmanaged.passUnretained(str).toOpaque() ) // 打印内存地址
self.view.backgroundColor = UIColor.lightGray
makeBtn()
// Do any additional setup after loading the view.
}
func makeBtn() {
let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
btn.setTitle("返回", for: UIControlState.normal)
btn.backgroundColor = UIColor.lightGray
btn.addTarget(self, action: #selector(btnClick), for: UIControlEvents.touchUpInside)
self.view.addSubview(btn)
}
@objc func btnClick(){
print("ddd")
dismiss(animated: true) {
print("1")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
SingleTest:
import UIKit
var username = "" //全局的,可以存储一些必备的.
enum alldata : String{ // 枚举 可以存储 接口
case loginUrl = "http://www.dansdasda/login"
case right = "右边"
}
class SingleTest {
static let shareInstance = SingleTest()
func getString() -> String {
// 例如 获取当前的时间, 按照一定的格式,在这里写好之后, 所有的地方就都可以调用这里的了.
return "共有方法,此处获取数据"
}
}
/*第一种,类常量 Class constant , 建议使用 支持赖加载 线程安全
class Singleton {
static let sharedInstance = Singleton()
}
*/
/*第二种 嵌套结构体变量格式
class Singleton {
class var sharedInstance: Singleton {
struct Static {
static let instance: Singleton = Singleton()
}
return Static.instance
}
}
*/
/* 第三种最不建议,但是最想oc 的创建方式 dispatch_once
class Singleton {
class var sharedInstance: Singleton {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: Singleton? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = Singleton()
}
return Static.instance!
}
}
https://stackoverflow.com/questions/24024549/using-a-dispatch-once-singleton-model-in-swift/24147830#24147830
*/
2 代理的具体代码
ViewController:
import UIKit
class ViewController: UIViewController, dwDelegate { // 第四步: 遵守协议
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
makeBtn()
// Do any additional setup after loading the view, typically from a nib.
}
func makeBtn() {
let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
btn.setTitle("btn", for: UIControlState.normal)
btn.backgroundColor = UIColor.lightGray
btn.addTarget(self, action: #selector(btnClick), for: UIControlEvents.touchUpInside)
self.view.addSubview(btn)
}
@objc func btnClick(){
print("ddd")
let vc = SecondViewController.init()
vc.delegate = self // 第五步,遵守协议
present(vc, animated: true, completion: nil)
}
func changeString(newString: String) { // 第六步: 实现协议
print(newString)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
SecondViewController:
import UIKit
protocol dwDelegate {//第一步 定义协议
func changeString(newString: String)
}
class SecondViewController: UIViewController {
var delegate: dwDelegate? // 第二步 声明协议
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.lightGray
makeBtn()
// Do any additional setup after loading the view.
}
func makeBtn() {
let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
btn.setTitle("返回", for: UIControlState.normal)
btn.backgroundColor = UIColor.lightGray
btn.addTarget(self, action: #selector(btnClick), for: UIControlEvents.touchUpInside)
self.view.addSubview(btn)
}
@objc func btnClick(){
print("ddd")
dismiss(animated: true) {
print("1")
self.delegate!.changeString(newString: "hahaha") // 第三步 触发协议
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
3 闭包的具体代码
ViewController
import UIKit
class ViewController: UIViewController {
var cusVC = CustomPickerView()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.brown
//makePickerView()
makeNewView()
// Do any additional setup after loading the view, typically from a nib.
}
func makeNewView() {
cusVC = CustomPickerView.init(frame: CGRect(x: 0,y: UIScreen.main.bounds.size.height - 0,width: UIScreen.main.bounds.size.width, height: 260))
self.view.addSubview(cusVC)
cusVC.callBackBlock { (str) in //第五步 触发闭包回调
print(str)
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
UIView .animate(withDuration: 0.5) {
self.cusVC.frame = CGRect(x: 0,y: UIScreen.main.bounds.size.height - 260,width: UIScreen.main.bounds.size.width, height: 260)
};
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
CustomPickerView:
import UIKit
//第一步 定义闭包
typealias swiftBlock = (_ str: String) -> Void
class CustomPickerView: UIView {
var callBack : swiftBlock? //第二步 声明
override init(frame:CGRect) {
super.init(frame:frame)
self.backgroundColor = UIColor.white
makeTwoBtn()
}
func callBackBlock(_ block: @escaping swiftBlock) { // 第三步 实现闭包
callBack = block
}
@objc func twoBtnClick(btn: UIButton) {
UIView.animate(withDuration: 0.1, animations: {
self.frame = CGRect(x: 0,y: UIScreen.main.bounds.size.height - 0,width: UIScreen.main.bounds.size.width, height: 260)
})
if callBack != nil { // 第四步 触发闭包
callBack!("闭包传值")
}
}
func makeTwoBtn() {
let leftBtn = UIButton(frame:CGRect(x: 60,y: 105,width: 50, height:30))
leftBtn.setTitle("确定", for: UIControlState.normal)
leftBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15)
leftBtn.layer.cornerRadius = 2
leftBtn.layer.masksToBounds = true
leftBtn.backgroundColor = UIColor.init(red: 255/255.0, green: 100/255.0, blue: 150/255.0, alpha: 1)
leftBtn.setTitleColor(UIColor.white, for: UIControlState.normal)
leftBtn.addTarget(self, action: #selector(twoBtnClick), for: UIControlEvents.touchUpInside)
self.addSubview(leftBtn)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}