創(chuàng)建一個(gè)類(lèi)
//類(lèi)名要大寫(xiě)
class Person: NSObject {
//屬性
var name: String
var age: Int
//構(gòu)造函數(shù)
init(name: String,age: Int) {
self.name = name
self.age = age
super.init()
}
//方法
func eat() {
print("吃")
}
}
類(lèi)的四種屬性
import UIKit
class Dog: NSObject {
var name: String = "旺財(cái)"
}
//屬性
//存儲(chǔ)屬性:當(dāng)對(duì)象創(chuàng)建之后屬性一直存在,直到對(duì)象釋放
//計(jì)算屬性:當(dāng)調(diào)用這個(gè)屬性的時(shí)候,臨時(shí)生成一個(gè)值
//可選屬性:屬性是一個(gè)可選值
//懶加載屬性:當(dāng)首次調(diào)用的時(shí)候加載
class Person: NSObject {
//存儲(chǔ)屬性
var name: String
var age: Int
//計(jì)算屬性
var kindName: String {
return "hi\(name)"
}
//可選屬性
var girlFriend: String?
//懶加載屬性
lazy var pet: Dog = Dog()
init(name: String,age: Int) {
self.name = name
self.age = age
super.init()
}
func eat() {
print("吃")
}
}
let xiaoming = Person(name: "xiaoming", age: 18)
print("name:\(xiaoming.name),age:\(xiaoming.age),kindName:\(xiaoming.kindName),girlFriend:\(xiaoming.girlFriend),pet:\(xiaoming.pet)")
類(lèi)的構(gòu)造
//swift類(lèi)的構(gòu)造過(guò)程:用類(lèi)來(lái)創(chuàng)建一個(gè)對(duì)象的過(guò)程
//類(lèi)的構(gòu)造過(guò)程,要保證類(lèi)的所有屬性都被正確初始化
//初始化:對(duì)類(lèi)的屬性賦值(存儲(chǔ)屬性)
swift類(lèi)構(gòu)造過(guò)程
//swift類(lèi)的構(gòu)造過(guò)程:先保證自己的存儲(chǔ)屬性被正確初始化,再保證父類(lèi)的存儲(chǔ)屬性被正確初始化(調(diào)用父類(lèi)的構(gòu)造函數(shù))
init(name: String,age: Int) {
self.name = name
self.age = age
//如果下面這句不寫(xiě),系統(tǒng)會(huì)自動(dòng)創(chuàng)建
super.init()
}
指定構(gòu)造器
//重載:在一個(gè)類(lèi)中,存在多個(gè)名字一樣的方法,但是參數(shù)的個(gè)數(shù)和名字不一樣
便利構(gòu)造器
//相當(dāng)于OC中的category
//便利構(gòu)造器
//需要用convenience修飾
//先調(diào)用指定構(gòu)造器
extension UILabel {
convenience init(title: String,fontSize: CGFloat = 13,alignment: NSTextAlignment = .left,textColor: UIColor = UIColor.darkGray,numberOfLines: Int = 0) {
//調(diào)用指定構(gòu)造器,保證所有的存儲(chǔ)實(shí)型被正確初始化
self.init()
//此時(shí)對(duì)象已創(chuàng)建
self.text = title
self.font = UIFont.systemFont(ofSize: 13)
self.textColor = textColor
self.textAlignment = alignment
self.numberOfLines = numberOfLines
}
}
//判斷構(gòu)造條件是否成立,如果成立,就調(diào)用指定構(gòu)造器完成構(gòu)造過(guò)程,如果不成立,就返回nil
//此時(shí)返回的是一個(gè)可選值
convenience init?(name: String,age: Int) {
if age > 100 {
return nil
}
self.init(name:name)
}
KVC構(gòu)造器
//Any: 任何類(lèi)型
//AnyObject: 對(duì)象類(lèi)型
//KVC構(gòu)造函數(shù),是在運(yùn)行時(shí),動(dòng)態(tài)的向?qū)ο蟀l(fā)消息,給對(duì)象的屬性賦值
//setValuesForKeys(dict):遍歷dict,找到dict的key值,逐一給對(duì)象的屬性賦值
//在kvc中,對(duì)于基本的數(shù)據(jù)類(lèi)型,如果設(shè)為可選,不兼容,會(huì)賦值失敗
//如果是基本的數(shù)據(jù)類(lèi)型,我們需要給它附一個(gè)初值
class Person: NSObject {
var name: String?
var age: Int = 0
//super.init() 在構(gòu)造函數(shù)中,如果沒(méi)有手動(dòng)添加,則會(huì)自動(dòng)添加在構(gòu)造函數(shù)的最后面
init(dict: [String: Any]) {
super.init()
//對(duì)象此時(shí)已創(chuàng)建
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forKey key: String) {
super.setValue(value, forKey: key)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {
//不要調(diào)用super
print("key:\(key),value:\(String(describing: value))")
}
}
實(shí)例方法和類(lèi)方法
//實(shí)例方法
func eat() {
print("實(shí)例方法")
}
//類(lèi)方法
class func eat() {
print("類(lèi)方法")
}
權(quán)限管理
public:公開(kāi),所有的類(lèi)都可以使用,自己封裝一個(gè)庫(kù)的時(shí)候使用
internal:只有在當(dāng)前命名空間可以使用,默認(rèn)的
fileprivate:只有當(dāng)前文件可以使用,在一個(gè)類(lèi)里面,總有一些屬性和方法是不需要公開(kāi)的,私有的屬性和方法,需要使用private來(lái)修飾
private:只有在當(dāng)前類(lèi)可以使用
每一個(gè)框架都是一個(gè)命名空間
在命名空間的內(nèi)部互相引用類(lèi),不需要import
使用框架需要引入框架的名字
對(duì)于不需要公開(kāi)的屬性和方法,需要使用private/fileprivate修飾
屬性觀察器
//: [Previous](@previous)
//屬性觀察器: 監(jiān)控屬性的值的變化
//willSet: 屬性將要賦值時(shí)調(diào)用, 它有一個(gè)默認(rèn)的參數(shù)叫newValue, 可以直接使用
//didSet: 屬性已經(jīng)賦值成功調(diào)用, 它有一個(gè)默認(rèn)的參數(shù)叫oldValue, 可以直接使用
//寫(xiě)法: 在屬性的后面接一個(gè)大括號(hào), didSet和willSet寫(xiě)在大括號(hào)的內(nèi)部
//實(shí)際開(kāi)發(fā)過(guò)程中的使用最廣泛的場(chǎng)景: 給model賦值, 賦值成功后更新UI, 就需要給model添加一個(gè)觀察器.
import Foundation
class Person: NSObject {
var name: String
var age: Int = 0
var weight: Float = 8 {
//將要給weight賦值
willSet(newValue) {
print("====\(newValue)")
}
//已經(jīng)給weight賦值成功
didSet(oldValue) {
print("====\(oldValue)")
if weight > 20 {
print("該減肥了")
}
if weight < 5 {
print("吃")
}
}
}
init(name: String) {
self.name = name
super.init()
}
}
let p = Person(name: "xiaoming")
print(p.weight)
p.weight = 20
可空鏈?zhǔn)秸{(diào)用
//可空鏈?zhǔn)秸{(diào)用:當(dāng)我們?cè)L問(wèn)一個(gè)可選對(duì)象的屬性時(shí),可以直接使用?,最終會(huì)返回一個(gè)可選值
class House: NSObject {
}
class Person: NSObject {
var house: House?
}
let person: Person? = Person()
let house = person?.house