2018-03-14 10:45:22 qq_35612929 阅读数 2104

九: 懒加载

懒加载是一个在项目中特别常用的东西,在OC中,一般是通过重写getter方法来实现,但是在Swift里,多了一个叫 lazy 的修饰符,多么形象生动的命名。具体应用举例如下:
//在Swift中只需要通过 “lazy” + “=” + “闭包” 就可以实现懒加载
lazy var dataList:[Any] = {
//而且看这里,如果闭包是用来做懒加载的话,那么()-> () in return 全都可以省略
        ["zyt", 1, (4 , 5), ("name","zyt"), ["age":"25"]]
    }()

要注意的一点是:添加到父视图的操作,千万不要写到懒加载里面,会出问题的!

知识点:

//在声明控件的时候,直接用let修饰,看起来好像也行,如下
let label: UILabel = {
    let label = UILabel.init()
    label.text = "测试"
    label.frame = CGRect.init(x: 0, y: 0, width: 100, height: 100)
    return label
}()
//像上面这么写,运行之后,看起来好像也没问题,但是如果是需要跟用户交互的话,比方说需要点击事件,那么像上面这样写就不行了
let btn: UIButton = {
    let btn = UIButton.init(type: .custom)
    btn.frame = CGRect.init(x: 0, y: 150, width: 100, height: 100)
    //如果是let修饰的话,当走到这里时,self还是nil。所以这样创建的按钮是不会响应点击事件的
    btn.addTarget(self, action: #selector(switchTypeAction), for: .touchUpInside)
    return btn
}
//因此如果创建的控件需要跟用户交互的话,必须使用懒加载  lazy var
2018-01-19 14:17:50 si1279571489 阅读数 1811

创建完了tableView,接下来要加载一些真实的数据,用到网络请求工具,我们封装网络请求工具必然用到单例模式及闭包,一步一步进行,现在就封装网络请求类为单例模式。
在swift3.0 已经废弃dispatch_once_t 方法,故不能再用oc的方法写单例,但是Swift给出的单例模式也是极其容易的。
继承自NSObject的SCHHttpManager为网络请求类,创建这个类为单例模式

1.设置静态变量 并保证线程安全
2.获取单例类的对象的类方法

//let 是线程安全的
static let _shareManager = SCHHttpManager()
class func shareManager()->SCHHttpManager{
    return _shareManager
}



调用

print(SCHHttpManager.shareManager())
print(SCHHttpManager.shareManager())
输出:两者地址相同,故单例完成
<SCHBurro.SCHHttpManager: 0x60000000db50>
<SCHBurro.SCHHttpManager: 0x60000000db50>

2017-10-18 18:23:24 bddzzw 阅读数 10274
/*
Swift 中的闭包有很多优化的地方
1 根据上下文推断参数和返回值的类型
2 从单行表达式闭包中隐式返回 可以省略return
3 可以使用简化的参数如 $0 $1 意为从0或者1开始
4 提供了尾随闭包的语法
*/
//语法   parameters参数 return 隐藏了
//{(parameters) -> return type in
//    parameters
//}
//最简单的闭包//省略in的
let b = {
    print("这也是闭包")
}

//用变量记录函数 (带参数的闭包)
//带有参数的闭包
//参数返回值 实现代码  {形参->返回值 in 代码}
//带参数待返回值的闭包
let countNum = {(num1:Int,num2:Int)->Int in
    return num1+num2;
}
let count1 = countNum(2,3)


//闭包的应用场景

/*异步执行完成回调  控制器之间的回调  自定义视图的回调*/

/*  以下代码需要在项目中的.Swift文件中完成
override func viewDidLoad() {
super.viewDidLoad()
loadData { (result) in
print("获取json信息\(result)")
}
// Do any additional setup after loading the view, typically from a nib.
}
func loadData(completion: @escaping (_ result: [String])->()) -> () {
DispatchQueue.global().async {
print("耗时操作\(Thread.current)")
Thread.sleep(forTimeInterval: 1.0);
let json=["12","23","34"]
DispatchQueue.main.async(execute: {
print("主线程\(Thread.current)")
completion(json)
})
}
}
结果为:耗时操作<NSThread: 0x600000277000>{number = 3, name = (null)}
主线程<NSThread: 0x604000075a80>{number = 1, name = main}
获取json信息["12", "23", "34"]
*/

//闭包表达式
let names = ["s","b","e","h","f"]

func backwards(a1:String,a2:String)->Bool{
    return a1<a2;
}
// public func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
var result = names.sorted(by:backwards)
print(result)

//参数名缩写
///以上代码还可以  Swift自动内联函数提供了参数名称缩写功能,您可以直接通过$0,$1,$2来顺序调用闭包的参数。
var result1 = names.sorted(by:{$0<$1})
print(result1)

//作为一个函数接受两个String类型的参数并返回Bool类型的值Swift可以自动推断出您想使用大于号的字符串函数实现:
//运算符函数
var result2 = names.sorted(by:<)
print(result2)

//尾随闭包
//例子1  尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。

var result3 = names.sorted(){$0<$1}
print(result3)



//例子2
//此时点回车函数会变成中括号的形式 也就是说如果函数的最后一个参数是闭包,函数的参数可以提前结束
//        最后一个参数直接使用{}来包装闭包的代码
//        loadData1(completion: <#T##([String]) -> ()#>)
//以下两段代码相同只不过一个是使用尾随闭包的写法
/*func loadData(completion:@escaping (_ result:([String])->())->()){
    DispatchQueue.global().async {
        print("耗时操作\(Thread.current)")
        Thread.sleep(forTimeInterval: 1.0);
        let json=["12","23","34"]
        //以下两段代码相同只不过一个是使用尾随闭包的写法
        DispatchQueue.main.async{
            print("主线程\(Thread.current)")
            completion(json)
        }
        DispatchQueue.main.async(execute: {
            print("主线程\(Thread.current)")
            completion(json)
        })
        
    }
}
*/


良言一句三冬暖,恶语伤人六月寒。无论工作还是生活,都不要拿脾气当做与他人博弈的武器。即使侥幸一时赢了,最终也只是两败俱伤。一言一语间,完成的是沟通,体现的是修养。或许我们不能成为优秀的别人,却完全可以做更好的自己。
2018-03-30 15:18:35 qq_31249697 阅读数 1131

//

//  locationBtn.swift

//  WenleSwift

//

//  Created by Chengzhe Bu on 2018/3/23.

//  Copyright © 2018年 Chengzhe Bu. All rights reserved.

//


import UIKit


class locationBtn: UIView {

    

    

    @IBOutlet weak var locaBtn: UIButton!

    


    static func newInstance() -> locationBtn?{

        let nibView = Bundle.main.loadNibNamed("locationBtn", owner: nil, options: nil)

        if let view = nibView?.first as? locationBtn{

            return view

        }

        return nil

    }

    

    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)

        load_init()

    }

    

    func load_init(){

        

        

    }


    @IBAction func toSelectionLoca(_ sender: Any) {

        

        

    }

    /*

    // Only override draw() if you perform custom drawing.

    // An empty implementation adversely affects performance during animation.

    override func draw(_ rect: CGRect) {

        // Drawing code

    }

    */


}


使用 ----- 

let loacBtn = locationBtn.newInstance()



2018-06-13 19:00:48 weixin_35484054 阅读数 666

swift4.0基于MVVM开发模式的简单demo

1.Alamofire (swift版的AFNetworking)封装与使用

2.ESPullToRefresh 上拉加载下拉刷新 简单使用

3.Kingfisher(swift版的SDWebImage)使用

4.SnapKit(swift版的Masonry)使用

5.SwiftyJSON(swift版本的JSONModel)使用

6.代理和block的使用

7.简单视频播放

下载链接:https://pan.baidu.com/s/1RsJ_3Qxc1QqBRX1eP2b26A

没有更多推荐了,返回首页