Swift基础小结2


一、类的介绍和定义

  1. swift也是一门面向对象开发的语言
    2.面向对象的基础是类,类产生了对象
    3.在swift中如何定义类呢?
    class是类的关键字,用来定义类
    class 类名 superClass {
    // 定义属性和方法
    }
    注意:
    1. 定义的类,可以没有父类,那么该类是rootClass
    2. 通常情况下,定义类时,继承自NSObject(非OC的NSObject)
    二、如何定义类的属性
    Swift中类的属性有多种
  2. 存储属性:存储实例的常量和变量
  3. 计算属性:通过某种方法计算出来的属性
  4. 类属性:与整个类自身相关的属性
    存储属性
    存储属性是最简单的属性,它作为类实例的一部分,用于存储常量和变量
    可以给存储属性提供一个默认值,也可以在初始化方法中对其进行初始化
/*
 * 1. 类的定义
 * 2. 创建类的对象
 * 3. 给类的属性赋值
     1> 直接赋值
     2> 通过KVC赋值
 * 4. 可以重写setValue(value: AnyObject?, forUndefinedKey key: String),那么字典中没有的字段可以在类中没有对应的属性
 * 5. override:重写,如果写的某一个方法是对父类的方法进行重写,那么必须在该方法之前加上override
 */

class Person : NSObject {
    var age : Int = 0
    
    // 重写父类的方法
    // override:重写,如果写的某一个方法是对父类的方法进行重写,那么必须在该方法之前加上override
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
}

let p = Person()
p.age = 20
p.setValuesForKeysWithDictionary(["age": 18, "name": "lmj"])
print(p.age)

类的属性代码示例

class Student: NSObject {
    // 定义属性
    // 定义存储属性
    var age: Int = 0
    var name : String? = nil
    
    var mathSource : Double = 0.0
    var chineseSource : Double = 0.0
    
    // 定义计算属性:通过别的方式计算到结果的属性,称之为计算属性
    var averageSource : Double {
        return (mathSource + chineseSource) * 0.5
    }
    
    // 定义类属性:类属性是跟整个类相关的属性,而且是通过类名进行访问
    static var courseCount : Int = 0
    
    
    
    /*
    // 定义一个方法,可以返回平均成绩
    func getAverageSource() -> Double {
        // 在swift开发中,如果使用当前对象的某一个属性,或者调用当前对象的某一个方法时,可以直接使用,不需要加self
        return (mathSource + chineseSource) * 0.5
    }
    */
}

// 创建对象
let stu = Student()
// 给对象的属性赋值
stu.age = 10
stu.name = "xxs"
stu.mathSource = 120
stu.chineseSource = 59

print(stu.age)
if let name = stu.name {
    print(name)
}

类的构造函数

  1. 构造函数类类似于OC中的初始化方法:Init方法
  2. 默认情况下创建一个类时,必然会调用一个构造函数
  3. 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数
  4. 如果是继承自NSObject,可以对父类的构造函数进行重写
    init(name : String, age : String) {self.name = name, self.age = age}
    init(dict: [String : AnyObject]) {dict["name"], dict["age"]} as? as!
    init(dict: [String: AnyObject]) {super.init() setValueeForKeysWithDic:dict}
class Person: NSObject {
    var name : String?
    var age : Int = 0
    
    override init() {
        // 在构造函数中,如果没有明确super.init(),那么系统将会帮助调用super.init()
//         super.init()
        print("----------")
    }
    
    // 自定义构造函数
    init(name : String, age : Int) {
        self.name = name
        self.age = age
    }
    
//    init(dict : [String: AnyObject]) {
//        let tempName = dict["name"]
//        // tempName是一个AnyObject?转成String
//        // as? 最终转成的类型是一个可选类型
//        name = tempName as? String
//        
////        let tempAge = dict["age"]
////        age = tempAge as! Int
//        // tempName是一个AnyObject?转成String
//        // as! 最终转成的类型是一个不可选类型,最好不要这样强制解包
//        /*
//        let tempAge1 = tempAge as? Int
//        if tempAge1 != nil {
//            age = tempAge1
//        }
//        */
//        
//        if let tempAge = dict["age"] as? Int {
//            age = tempAge
//        }
//        
//    }
    
    // 通过kvc给构造函数中的属性赋值
    init(dict : [String: AnyObject]) {
        super.init()
        
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
}

let p = Person()
let p1 = Person(name: "lmj", age: 18)
print(p.name)
print(p1.name)

let p2 = Person(dict: ["name": "we", "age": 15, "height": 120])
print(p2.name)

类里面监听属性的改变使用属性监听器进行监听

// 如何监听某一个类中的属性的改变,可以通过属性监听器来监听属性的改变
class Person: NSObject {
    // 属性监听器
    var name : String? {
        // 监听属性是否改变
        // willSet:属性即将改变时进行监听
        willSet {
            print(name)
            print(newValue)
        }
        
        // didSet:属性已经改变时进行监听
        didSet {
            print(name)
            print(oldValue)
        }
    }
    
}

let p = Person()
p.name = "why"
p.name = "dhs"

class MyCell: UITableViewCell {
    var person : Person?
}

闭包

  1. 闭包和OC中的block非常相似
    1.1 OC中的block是匿名的函数
    1.2 Swift中的闭包是一个特殊函数
    1.3 block和闭包经常用于回调
    注意:闭包和block一样,第一次使用时可能不习惯它的语法,可以先按照使用简单的闭包,随着学习的深入,慢慢掌握其灵活的运用方法
  2. 闭包的基本写法
    callBack : (参数列表) -> (返回值类型)
    3.闭包的循环引用
    1.weak var weakSelf = self weakSelf?
    2. [weak self] self? (推荐使用)
    3. [unowned self] self
    4.尾随闭包
    // 闭包的类型:(参数列表) -> (返回值类型)

HttpTool类

    func loadData(callBcak : (jsonData : String) -> ()) {        
        dispatch_async(dispatch_get_global_queue(0, 0)) {
            print("发送网络请求:\(NSThread.currentThread())")
            
            dispatch_sync(dispatch_get_main_queue(), {
                print("获取到数据,并且进行回调:\(NSThread.currentThread())")
                
                callBcak(jsonData: "jsonData数据")
            })
        }
    }

ViewController类
class ViewController: UIViewController {
    
//    var tools : HttpTool?
    var tools: HttpTool = HttpTool()

    override func viewDidLoad() {
        super.viewDidLoad()

//        tools = HttpTool()
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        /* weakSelf?.view
         如果前面的可选类型,没有值,后面的代码都不会执行
         如果前面的可选类型,有值,系统会自动将weakSelf进行解包,并且使用weakSelf
         */
        
        // 解决循环引用的方式一:
        /*
        // 0x0 -----> nil
        weak var weakSelf = self
        
        tools.loadData { (jsonData) in
            // print("在ViewController中拿到数据:\(jsonData)")
            weakSelf?.view.backgroundColor = UIColor.redColor()
         */
        
        
        // 解决循环引用的方式二:(推荐使用该方法)
        tools.loadData {[weak self] (jsonData) in
            // print("在ViewController中拿到数据:\(jsonData)")
            self?.view.backgroundColor = UIColor.redColor()
        }
        
        
        // 解决循环引用的方式三:
        tools.loadData {[unowned self] (jsonData) in
            // print("在ViewController中拿到数据:\(jsonData)")
            self.view.backgroundColor = UIColor.redColor()
        }
          
         // 尾随闭包:如果闭包作为方法的最后一个参数,那么闭包可以将()省略掉
        // 普通写法:
        tools.loadData ({[unowned self] (jsonData) in
            // print("在ViewController中拿到数据:\(jsonData)")
            self.view.backgroundColor = UIColor.redColor()
        })
        
        // 尾随闭包写法一:
        tools.loadData() {[unowned self] (jsonData) in
            // print("在ViewController中拿到数据:\(jsonData)")
            self.view.backgroundColor = UIColor.redColor()
        }
        
        // 尾随闭包写法二:
        tools.loadData {[unowned self] (jsonData) in
            // print("在ViewController中拿到数据:\(jsonData)")
            self.view.backgroundColor = UIColor.redColor()
        }

    }
    
    // deinit相当于OC中的dealloc方法,当对象销毁时会调用该函数
    deinit {
        print("ViewController-------deinit")
        
    }

}

懒加载
1.swift中也有懒加载的方式
(苹果的设计思想:希望所有的对象在使用时才真正加载到内存中去)
2.和OC中不同的是swift有专门的关键字来实现懒加载

  1. lazy关键字可以用于定义某一个属性懒加载
懒加载的格式:
lazy var 变量 : 类型 = {创建变量代码}()

// 懒加载的本质是,第一次使用的时候执行闭包,将闭包的返回值赋值给属性
// lazy的作用是只会赋值一次
lazy var array : [String] = {
       () -> [String] in
      return ["www", "cb", "wds"]
}
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容