@(〓〓 iOS-Swift語法)[Swift 語法]
- 作者: Liwx
- 郵箱: 1032282633@qq.com
iOS Swift 語法
底層原理
與內(nèi)存管理
分析 專題:【iOS Swift5語法】00 - 匯編
01 - 基礎語法
02 - 流程控制
03 - 函數(shù)
04 - 枚舉
05 - 可選項
06 - 結構體和類
07 - 閉包
08 - 屬性
09 - 方法
10 - 下標
11 - 繼承
12 - 初始化器init
13 - 可選項
目錄
- 13.Swift 類的構造函數(shù)
- 1.構造函數(shù)的介紹
- 2.構造函數(shù)的基本使用
- 構造函數(shù)的基本使用
- 初始化時給屬性賦值
- 字典轉模型(初始化時傳入字典)
- 字典轉模型(利用KVC轉化)
1.構造函數(shù)的介紹
-
構造函數(shù)
類似于OC中的初始化方法:init方法
- 默認情況下載
創(chuàng)建一個類
時,必然會調用一個構造函數(shù)
- 即便是沒有編寫任何構造函數(shù)旭绒,編譯器也會提供一個默認的構造函數(shù)养筒。
- 如果是
繼承自NSObject,可以對父類的構造函數(shù)進行重寫
.
2.構造函數(shù)的基本使用
構造函數(shù)的基本使用
- 類的屬性必須有值
- 如果不是在定義時初始化值,可以在構造函數(shù)中賦值
class Person : NSObject {
var name : String?
var age : Int = 0
// ------------------------------------------------------------------------
// 1.1 注意: 在Swift中在本類中實現(xiàn)父類已有的方法,則必須明確指明是`方法的重寫`,使用override
override init () {
name = ""
age = 0
}
}
// 創(chuàng)建一個Person對象
let p = Person()
初始化時給屬性賦值
- 很多時候,我們在創(chuàng)建一個對象時就會給屬性賦值
- 可以自定義構造函數(shù)
- 注意:如果自定義了構造函數(shù),會覆蓋init()方法.即不在有默認的構造函數(shù)
class Person : NSObject {
var name : String?
var age : Int = 0
// ------------------------------------------------------------------------
// 1.2 自定義構造函數(shù)
// 如果在一個方法中,`方法中的變量和屬性名同名`,則使用屬性是,需加加上self,不然會有歧義
// 在`閉包中使用當前類的屬性`也需要加上`self`
// 自定義構造函數(shù),通知指定屬性的值
init(name : String, age : Int) {
self.name = name
self.age = age
}
}
// 創(chuàng)建一個Person對象
let p = Person(name: "liwx", age: 18)
字典轉模型(初始化時傳入字典)
- 真實創(chuàng)建對象時,更多的是將
字典轉成模型
- 注意:
- 去字典中取出的是NSObject,任意類型.
- 可以通過
as!
轉成需要的類型,再賦值(不可以直接賦值).如果屬性是可選類型
,需用as?
將dict["key"]轉成對應的類型.
class Person: NSObject {
var name : String
var age : Int
// ------------------------------------------------------------------------
// 1.3 自定義構造函數(shù),字典轉模型.從字典中根據(jù)key逐一取出對應的value進行賦值
init(dict : [String : AnyObject]) {
// 注意: 需將AnyObject轉換成具體類型
// AnyObject as? String : 將AnyObject轉成字符串的可選類型
// AnyObject as! String : 將AnyObject轉成字符串類型
// dict["age"]和dict["name"]取出來的都是String?可選類型的,所以需要將可選類型轉為Int類型
name = dict["name"] as? String
if let tempAge = dict["age"] as? Int {
tempAge
age = tempAge
}
}
}
// 創(chuàng)建一個Person對象
let dict = ["name" : "liwx", "age" : 18]
let p = Person(dict: dict)
字典轉模型(利用KVC轉化)
- 利用
KVC字典轉模型
會更加方便 - 注意:
KVC并不能保證會給所有的屬性賦值
- 因此屬性
需要有默認值
- 基本數(shù)據(jù)類型默認值設置為0
- 對象或者結構體類型定義為可選類型即可(可選類型沒有賦值前為nil)
- 使用KVC字典轉模型
必須先調用super.init()
- 如果類中沒有字典中的屬性,必須
重寫setValueforUndefinedKey方法
,不然程序會奔潰
class Person : NSObject {
var name : String?
var age : Int = 0
// ------------------------------------------------------------------------
// 1.4 直接通過KVC方式進行賦值. 注意: 如果類中沒有字典中的屬性,必須重寫setValueforUndefinedKey方法,不然程序會奔潰
// 注意: 在構造函數(shù)中,如果有調用當前對象的某些函數(shù),必須在調用前先寫: super.init()
init(dict : [String : AnyObject]) {
// 使用KVC字典轉模型必須先調用super.init()
super.init()
// 調用setValuesForKeysWithDictionary
setValuesForKeysWithDictionary(dict)
}
// 如果類中沒有字典中的屬性,必須重寫setValueforUndefinedKey方法,不然程序會奔潰
// 本類中并沒有height屬性,而字典有height屬性
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
}
}
// 3.通過`字典`轉`模型對象`
let p2 = Person(dict: ["name" : "liwx", "age" : 18, "height" : 1.88])
print(p2.name)
print(p2.age)