欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swift 基础

程序员文章站 2022-03-01 17:01:50
...

继承自NSObject 对象的构造函数 自定义构造函数 kvc

import Foundation

class Student: NSObject {

    var age: Int = 0
    var name: String?
    
    // 继承NSObject 重写构造函数
    override init() {
        age = 10
        name = "jake"
    }
    
    // 构造函数类似于oc中的初始化方法: init方法
    // 默认创建一个类时,必回调用一个构造行数
    // 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数
    // 如果是继承自NSObject,可以对父类的构造函数进行重写
    
    init(age:Int, name:String){
        self.age = age
        self.name = name
    }
    
    // 1.super.init()必须重写
    init(dict:[String: AnyObject]){
        super.init()
        setValuesForKeysWithDictionary(dict)

    }
}

UIKit的控件的封装实例

import UIKit

class CustonView: UIView {

    // MARK:- 属性
    var imageView:UIImageView?
    var baseTableView:UITableView?
    var name:String?
    
    
    // 重写initWithFrame方法
    override init(frame: CGRect) {
        super.init(frame: frame)
        // 添加在控件
        let image = UIImageView()
        image.backgroundColor = UIColor.redColor()
        imageView = image
        addSubview(image)
    
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        imageView?.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height - 20)
    }
}

防止闭包导致的循环引用

// 方式一
        weak var weakSelf = self
        test { ()->() in
            weakSelf?.view.backgroundColor = UIColor.redColor()
        }
        
        
        // 开发中这样写
        // 方式二 开发中建议这样写
        test { [weak weakSelf]()->() in
            weakSelf?.view.backgroundColor = UIColor.redColor()
        }
        
        // 方式三
        // 存在潜在风险 如果self为nil 奔溃
        test { [unowned self]()->() in
            self.view.backgroundColor = UIColor.redColor()
        }

懒加载

// MARK:- 懒加载
    // 它本质在siwft中确实是一个闭包,执行顺序是这样的,如果这个lazy修饰的变量没值,就会执行闭包中的东西,不是每次都执行(本人补充:这也就是为什么在Swift中的懒加载没有oc中判断。if(xx==nil){初始化xx}的代码段)
    /*
        1.Swift实现懒加载必须使用var关键字来定义延时加载的属性,而不可以使用let关键字,
        2.后面通过等号赋值一个闭包,闭包后面必须加上()
    */
    

    lazy var dataArray1:[AnyObject] = {
        ()-> [AnyObject] in
        
        let tempeDataArray = [12, 23, 23, "jake"]
        return tempeDataArray
    }()
    
    // 简化
    lazy var dataArray2:[AnyObject] = {
        
        let tempeDataArray = [12, 23, 23, "jake"]
        return tempeDataArray
    }()
    
    // 对于一些简单的就不需要闭包 
    lazy var dataArray3:[AnyObject] = [12, 23, 23, "jake"]

使用Swift使用TableView体验

import UIKit

class TwoSwfitExampleVC: UIViewController{

    // MARK:- myTableView初始化
    lazy var myTableView:UITableView = {
        
        let templeTable = UITableView()
        return templeTable
    }()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

         // MARK:- 初始化
        setUp()

    }
    
    // MARK:- 初始化
    func setUp() -> Void {
        myTableView.delegate = self
        myTableView.dataSource = self
        myTableView.frame = view.bounds
        view.addSubview(myTableView)
    }
    

}

// 利用swift中的extension UITableViewDataSource代理
extension TwoSwfitExampleVC: UITableViewDataSource, UITableViewDelegate
{
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let ID = "cellID"
        var cell = tableView.dequeueReusableCellWithIdentifier(ID)
        if cell == nil {
            cell = UITableViewCell(style: .Default, reuseIdentifier: ID)
        }
        
        cell?.textLabel?.text = "第\(indexPath.row)行"
        return cell!
        
    }
}

swift体验按钮事件的点击

// 创建按钮
        let btn = UIButton(type: .Custom)
        btn.setTitle("按钮", forState: .Normal)
        btn.setBackgroundImage(UIImage(named: "图片名"), forState: .Normal)
        btn.backgroundColor = UIColor.redColor()
        btn.frame = CGRect(x: 100, y: 100, width: 90, height: 30)
        // UIButton监听事件的点击 方法用#selector(方法名) 如果需要将点击的按钮传递过去方法名不需要添加冒号 :
        btn.addTarget(self, action: #selector(btnClick), forControlEvents: .TouchUpInside)
        view.addSubview(btn)

 // 按钮点击的监听方法
    func btnClick(btn:UIButton) -> Void {
        
        print("按钮点击了", btn)
    }

swift体验通知的使用

// 注册监听
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MethodName), name: "监听通知名称", object: nil)

 // 发送一个通知
        NSNotificationCenter.defaultCenter().postNotificationName("通知名称", object: nil)

// MARK:- 监听通知的方法
    func MethodName() -> Void {
        print("监听到通知")
    }

swift给系统已有的类扩充类方法 自定义构造方法
拿创建按钮来举例
1.创建一个Swift文件 命名UIButton-Extension.swift
2.通过extension 对已有的类进行扩展方法

import UIKit

extension  UIButton {
    
    // 类方法 static开头
    static func createButton(NorImage: String, seleImage: String) ->UIButton{
    
        let btn = UIButton(type: .Custom)
        
        btn.setImage(UIImage(named: NorImage), forState: .Normal)
        btn.setImage(UIImage(named: seleImage), forState: .Selected)
        btn.sizeToFit()
        
        return btn
    }
    
    // 自定义构造方法 遍历构造函数
    convenience init(NorImage: String, seleImage: String){
        
        // 1.必须先初始化 否则报错
        self.init()
        
        // 2.设置默认的配置
        setImage(UIImage(named: NorImage), forState: .Normal)
        setImage(UIImage(named: seleImage), forState: .Selected)
        sizeToFit()
    
    }
}

// 外界的使用
        // 通过类方法创建
//        let button = UIButton.createButton(<#T##NorImage: String##String#>, seleImage: <#T##String#>)
        
        // 通过便利构造函数
        let button = UIButton(NorImage: <#T##String#>, seleImage: <#T##String#>)

swift私有方法


let tap = UITapGestureRecognizer(target: self, action: #selector(tap))
        view.addGestureRecognizer(tap)

// MARK: 监听事件的私有方法
    @objc private func tap(tap:UITapGestureRecognizer) -> Void {
        
        print("--------------tap")
    }

swift switch使用

let taprecongnizer = UIPanGestureRecognizer(target: self, action: #selector(tap))
        view.addGestureRecognizer(taprecongnizer)

// MARK: 监听事件的私有方法
    @objc private func tap(tap:UITapGestureRecognizer) -> Void {
        
        
        switch tap.state {
        case .possible:
            print("没有触摸事件发生,所有手势识别的默认状态")
        case .began:
            print("一个手势已经开始但尚未改变或者完成时")
        case .changed:
            print("手势状态改变")
        case .ended:
            print("手势完成")
        default:
            print("----")
        }
    }

swift 枚举的写法

enum HTTableViewType : Int {

    case defaultType
    case customType
}

// MARK: 定义一个枚举类型的属性
var type: HTTableViewType = .defaultType

class ViewController: UIViewController {

    // MARK: 定义一个枚举类型的属性
    var type: HTTableViewType = .defaultType

}

swift 加载xib中自定义的View

Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as! CustomView

案例 封装一个View 使用代理 讲view内部按钮触发的事件 让控制器监听
知识点
1.快速创建xib中的View
2.类方法的写法(static)
3.代理的写法

CustomView.swift

import UIKit

protocol CustomViewDelegate {
    /**
     事件描述 参数: 参数类型
     _ 自己: 自己的类型
     */
    func customView(_ customView: CustomView, didClickBtn btn: UIButton)
    
}

class CustomView: UIView {

    // MARK: 代理属性
    var delegate: CustomViewDelegate?
    

}

// 快速初始化
extension CustomView{

    // 快速创建的类方法
    static func customView() -> CustomView {
        return Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as! CustomView
    }
}


extension CustomView{

    @IBAction func myBtnClick(_ sender: UIButton) {
        
        // 触发内部事件 让代理代理方法
        delegate?.customView(self, didClickBtn: sender)
        print("hheheh")
    }
    
}

ViewController.swift

class ViewController: UIViewController {
    
       let customView = CustomView.customView()
        customView.delegate = self
        view.addSubview(customView)
}

extension ViewController: CustomViewDelegate{
    func customView(_ customView: CustomView, didClickBtn btn: UIButton) {
        
        print("view的按钮被点击")
    }
}