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的按钮被点击")
}
}
上一篇: Linux配置静态路由
下一篇: 数组填充Array.fill()