swift 元类构造方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift 元类构造方法相关的知识,希望对你有一定的参考价值。
参考技术A 一,如果是继承自NSObject,可以对父类的构造函数进行重写//构造函数class Person: NSObject
var name : String?
var age :Int = 0
override init()
//在构造函数中,如果没有明确调用super.init(),系统会帮我们调用(仅仅只在构造函数中,其他函数中不会)
super.init()
//自定义构造函数
init(name:String, age : Int)
print("----")
self.name = name self.age = age
init(dict: [String : AnyObject])
// as? 转成可选类型
// as! 转成确定类型
self.name = dict["name"] as? String
//可选类型: 先判断等号后面的有没有值,没有值就不执行后面括号,有值就将等号后面的强制解包赋值给等号前面的// if let tempAge = dict["age"] as? Int// age = tempAge//
//相当于下面这段代码:
let tempAge = dict["age"]
let tempAge1 = tempAge as? Int
if tempAge1 != nil
age = tempAge1!
let p = Person.init(name: "ss", age: 4)let p1 = Person.init(dict: ["name" : "jack","age" : 18])
最后需要注意的点:自定义构造函数,如果没有重写默认的构造函数init(),系统会覆盖掉默认构造函数init(),如果不想覆盖掉,必须重写init()方法
二,便利构造函数
1,在OC中当需要对系统的类进行扩充时,我们通常会选择用类别,swift中同样也可以对系统的类扩展方法,
7522B840-76FD-4679-8BBD-6B0244159C95.png
2,首先新建个swift file文件,命名为:UIButton-Extension.swift,导入UIKit
import UIKitextension UIButton
///扩展类方法
class func creatBtn (image : String, bgImage : String) -> UIButton
let btn = UIButton.init()
btn.setBackgroundImage(UIImage.init(named: bgImage), forState: .Normal)
btn.setBackgroundImage(UIImage.init(named: bgImage + "_highlighted"), forState: .Highlighted)
btn.setImage(UIImage.init(named: image), forState: .Normal)
btn.setImage(UIImage.init(named: image + "_highlighted"), forState: .Highlighted)
btn.sizeToFit()
return btn
///convenience:便利构造函数
convenience init(image : String, bgImage : String )
//便利构造函数必须得调用 self.init()
self.init()
self.setBackgroundImage(UIImage.init(named: bgImage), forState: .Normal)
self.setBackgroundImage(UIImage.init(named: bgImage + "_highlighted"), forState: .Highlighted)
self.setImage(UIImage.init(named: image), forState: .Normal)
self.setImage(UIImage.init(named: image + "_highlighted"), forState: .Highlighted)
self.sizeToFit()
调用:let btn = UIButton.creatBtn("tabbar_compose_icon_add", bgImage: "tabbar_compose_button")let btn = UIButton.init(image: "tabbar_compose_icon_add", bgImage: "tabbar_compose_button")
同样的对UIBarButtonItem也可以扩充方法
import UIKitextension UIBarButtonItem
/* 第1种
convenience init(image : String)
self.init()
let btn = UIButton.init()
btn.setImage(UIImage.init(named: image), forState: .Normal)
btn.setImage(UIImage.init(named: image + "_highlighted"), forState: .Highlighted)
btn.sizeToFit()
self.customView = btn
*/
// 第2种
convenience init(image : String)
let btn = UIButton.init()
btn.setImage(UIImage.init(named: image), forState: .Normal)
btn.setImage(UIImage.init(named: image + "_highlighted"), forState: .Highlighted)
btn.sizeToFit()
self.init(customView:btn)
调用:
navigationItem.rightBarButtonItem = UIBarButtonItem.init(image: "navigationbar_pop")
Swift 构造方法
Swift5 构造方法
1. Swift 类的构造方法
// Swift5 类的构造方法
// 1. 在构造方法中需要给没有默认值的属性初始化值
class Demo1
// 含有默认值
var param1: String = "default"
// 未指定默认值,需要在 init() 中初始化
var param2: String
// 未指定默认值,类型为 Optional,可空,
// 默认值为 nil, 不需要在 init() 中初始化
var param3: String?
init(param: String)
self.param2 = param
// 2. 如果属性有默认值,则自动生成一个无参构造方法 init(),即初始化后的实例的属性都有默认值
class Demo2
var param1 = "param1 String"
var param2 = "param2 String"
var demo2 = Demo2()
print("param1: \\(demo2.param1), param2: \\(demo2.param2)")
2. Swift 结构体的构造方法
// Swift5 结构体的构造方法
struct StructDemo
var param1: String
var param2: String
// 结构体的构造方法会默认生成,将所有属性作为参数
init(param1: String, param2: String)
self.param1 = param1
self.param2 = param2
init()
// 在自定义的构造方法中调用默认的构造方法
self.init(param1: "init value1", param2: "init value2")
// 调用结构体默认的构造方法
var structIns1 = StructDemo(param1: "value1", param2: "value2")
// 调用结构体自定义的构造方法
var structIns2 = StructDemo()
3. Swift 指定构造 方法 和 便利构造 方法
指定构造方法 designated 与 便利构造方法 convenience 。使用原则:
- 子类的指定构造方法中必须调用父类的指定构造方法
- 便利构造方法中必须调用当前类的其他构造方法
- 便利构造方法最终是要调用指定某个构造方法
// Swift5 指定构造方法和便利构造方法
// 定义一个含有指定构造和便利构造的父类
class Base
// 默认的指定构造方法
init()
print("base class designated constructor method")
// 声明一个便利构造方法
convenience init(param: Int)
print("base class convenience constructor method")
// 最终调用指定构造方法
self.init()
var baseIns = Base(param: 0)
// 继承父类
class Sub : Base
override init()
// 如果重写父类的指定构造方法,必须调用 super
super.init()
convenience init(param: Int)
// 在便利构造方法中调用指定的构造方法
print(param)
self.init()
convenience init(param1: Int, param2: Int)
// 在便利构造方法中调用另一个便利构造方法
print(param1, param2)
self.init(param: param1)
var subIns = Sub(param1: 0, param2: 1)
4. Swift 构造方法的安全性检查
- 必须在调研父类的指定构造方法前完成自身属性的赋值
- 必须在调用父类指定的构造方法之后,在子类中才能修改父类的属性值
- 在调用父类的构造方法之后,才能使用 self 关键字
- 在便利构造方法中要修改属性值必须在调用指定构造方法之后
// Swift5 构造方法的安全性检查
class BaseCheck
var field: String
init(field: String)
self.field = field
class SubCheck: BaseCheck
var subField: String
init()
// 1. 必须在调研父类的指定构造方法前完成自身属性的赋值
subField = "sub field value"
super.init(field: "base field value")
// 2. 必须在调用父类指定的构造方法之后,在子类中才能修改父类的属性值
field = "base field set in sub"
// 3. 在调用父类的构造方法之后,才能使用 self 关键字
self.subField = "sub field value set again"
print(subField, field)
convenience init(param: Int)
// 4. 在便利构造方法中要修改属性值必须在调用指定构造方法之后
self.init()
subField = "subField set in convenience \\(param)"
field = "field set in conveniencem \\(param)"
print(subField, field)
var checkIns = SubCheck(param: 1)
5. Swift 定义可失败的构造方法
// Swift5 定义可失败的构造方法
class CanBeNil
var field: Int
// 构造可能会失败返回 nil
init?(param: Int)
guard param > 0 else
return nil
field = param
let ins = CanBeNil(param: 0) // nil
6. Swift 必要构造方法 与 析构方法
// Swift5 必要构造方法与析构方法
class DemoClass
var field: Int
// 声明必要构造方法,子类必须继承或重写
required init(param: Int)
field = param
// 析构方法,类实例被销毁
deinit
// 实例被释放
print("demo instance destroy")
// 定义可选类型
var demoIns: DemoClass? = DemoClass(param: 1)
demoIns = nil // 被赋值 nil 时,deinit会调用
GitHub 源码:Constructor.playground
以上是关于swift 元类构造方法的主要内容,如果未能解决你的问题,请参考以下文章