swift学习(面向对象)

无意间看到自己以前学习swift的笔记,从近两年苹果的发布会,可以看出苹果推动swift的决心,OC更换为swift也是未来发展的趋势,想起当初自己钻研学习swift的痛苦的情景,现在把它们整理出来并与现在最新的swift结合以供初学者使用,让初学者少走弯路。有时间会陆续整理后面知识的学习笔记。

属性的定义和赋值

存储型属性的初始赋值
  • 在 classs 的大括中像定义一个变量或常量一样,定义一个属性
  • 定义时可以设一个默认值
  • 如果没有设默认值,需要在构造器中为属性设初值
  • 构造完成的对象可以通过点语法修改属性的值
   class Person {
   var name: String
   var age: Int
   var kindname: String? = "旺财"

  init(name: String, age: Int) {
    self.name = name
    self.age = age
  }
  }
通过闭包和函数来设置属性的默认值
  • 闭包结尾的大括号后面接了一对空的小括号,表示立刻执行该闭包
  • 需要在闭包中 return 一个值,赋给该变量
   class Person {
   var weight:Float = {
   return 165 
  }()
  }
  let xiaoMing = Person()
  xiaoMing.weight = 175
  print("xiaoMing的身高是\(xiaoMing.weight)")

如果你使用闭包来初始化属性的值,请记住在闭包执行时,实例的其它部分都还没有初始化。
这意味着你不能够在闭包里访问其它的属性,就算这个属性有默认值也不允许。
同样,你也不能使用隐式的self属性,或者调用其它的实例方法


存储属性与计算属性
  • 存储属性需要分配内存空间存储属性的值
  • 计算属性不存储值,更像是调用一个函数,返回函数的结果
  class Person {
  var name: String
  var age: Int
  var kindname: String {
   return "亲爱的\(name)"
  }

  init(name: String, age: Int) {
    self.name = name
    self.age = age
  }
  }

  struct Point {
  var x = 0.0, y = 0.0
  }
  struct Size {
  var width = 0.0, height = 0.0
  }
  struct Rect {
  var origin = Point()
  var size = Size()
  var center: Point {
    get {
        let centerX = origin.x + (size.width / 2)
        let centerY = origin.y + (size.height / 2)
        return Point(x: centerX, y: centerY)
    }
    set(newCenter) {
        origin.x = newCenter.x - (size.width / 2)
        origin.y = newCenter.y - (size.height / 2)
    }
  }
  }
  var square = Rect(origin: Point(x: 0.0, y: 0.0),
  size: Size(width: 10.0, height: 10.0))
  let initialSquareCenter = square.center
  square.center = Point(x: 15.0, y: 15.0)

可选属性

对于存储属性:

  • 可选的 var 属性,如果没有赋初值,它有一个默认的初始值 nil
  • 可选的 let 属性,如果没有赋初值,默认值为空。需要在构造函数里赋值
  class Person {
  let girlFriend: Int?
  var boyFriedn: Int?
  var name: String
  var age: Int
  var kindname: String {
  return "亲爱的\(name)"
  }

  init(name: String, age: Int, girlFriend) {
    girlFriend = Person()
    self.name = name
    self.age = age
  }
  }

属性观察器
  • 可以用属性观察器观察属性的变化
  • willSet 有一个默认的参数 newValue
  • didSet 有一个默认的参数 oldValue
  • 存储型属性设置默认值或者在构造器中为其赋值时, 不会触发属性观察器
  var weight: Float {
  willSet {
    if weight < 90 {
        print("吃吃吃:\(newValue)")
    }
   }

  didSet {
    if weight > 180 {
        print("该减肥了:\(oldValue)")
    }
  }
  }

懒加载
特点
  • 第一次被调用的时候初始化
  • 必须使用 var, 因为属性的初始值可能在实例构造完成之后才会得到, 而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性
  • 使用lazy来标示一个延迟存储属性
  class Person {

  var weight: Int = 100

  //懒加载
  lazy var health: String = {
    return weight > 100 ? "不健康" : "健康"
  }()
  }

懒加载、用闭包给存储属性赋默认值、计算属性区别
  • 懒加载

    • 值会存储
    • 需要加lazy
    • 可以使用 self
    • 闭包必须执行
    • 只执行一次
  • 用闭包为属性赋默认值

    • 值会存储
    • 不可以使用 self
    • 设默认值只执行一次
    • 只执行一次
  • 计算型属性

  • 不存储值,只返回结果

  • 不可以使用 self

  • 每次调用时都会被执行

    class Person {

    var weight: Int = 100

    // 为属性赋默认值
    var height:Float = {
     return 165 
    }()

    //计算属性
    var morningHeight: Float {
    return height + 10
    }

    //懒加载
    lazy var health: String = {
    return weight > 100 ? "不健康" : "健康"
    }()
    }

方法
方法的定义和调用
class Person {

var name:String
var age: Int

init(name: String age:Int) {
    self.name = name
    self.age = age
}

//实例方法
func earnMoney(earnedMoney: Double){
    money += earnedMoney
}
}

let xiaoming = Person(name: "XiaoMing", age: 15)
xiaoming.earnMoney()
实例方法与类方法
  • 实例方法是被类型的某个实例调用的方法
  • 类方法是给类本身调用的方法
  • 一个方法实现类的某个特定功能
   class Person {
   static var country = "china" //类属性

    //类方法
    static func changeCounry(newCountry: String){
    country = newCountry
    }

    //类方法
    override static func changeCounry(newCountry: String){
    country = newCountry
  }

  //实例方法
  func earnMoney(earnedMoney: Double){
    money += earnedMoney
  }
  }

类的构造
构造器

类的构造过程,就是在创建对象的时候,为对象分配内存空间,确保对象的所有存储属性都有默认值的过程。
构造器,就是为所有没有默认值的属性设置默认值的函数

  • 默认构造器
    • 如果所有属性都有默认值,swift会为类提供一个默认构造器,其调用方式为 �SomeClass()
    class Person () {
    var postion: String = "earth"
    var leg: Int = 2
    var arm: Int = 2
    var hourse: String?
    }
    //所有属性都有默认值,swift会提供一个默认的构造器
    let person = Person()
  • 指定构造器
  • 自已定义的构造器
  • 可以初始化属性
  • 必须调用其直接父类的指定构造器
    class Person () {
    var postion: String = "earth"
    var leg: Int = 2
    var arm: Int = 2
    var hourse: String?
    var name: String
    var age: Int
    init(name:String, age: String) {
    self.name = name
    self.age = age
    }
    }
    //所有属性都有默认值,swift会提供一个默认的构造器
  • 便利构造器
  • 简化类的构造过程
  • 本身不负责属性的创建和初始化工作
  • 调用指定构造器为属性指定初始值
     //1. 必须使用convenience修饰
     //2. 必须先调用指定构造器

     //相当于oc中的category
    extension UILabel {
    convenience init (title: String, fontSize: CGFloat = 13, textColor: UIColor = UIColor.darkGray, alignMent: NSTextAlignment = .left, numOfLines: Int = 0) {
    //调用指定构造器,保存所有的存储属性被正确初始化
    self.init()
    //此时对象已创建
    self.text = title
    self.font = UIFont.systemFont(ofSize: fontSize)
    self.textColor = textColor
    self.textAlignment = alignMent
    self.numberOfLines = numOfLines
    }
    }

    / /便利构造器:主要用 简化类的构造过程的
       //便利构造器的用法二:
      //判断构造条件是否成立,如果成立,就调用指定构造器,完成构造过程
     //如果不成立,就返回nil
    //此时返回的是一个可选值
     convenience init?(name: String, age: Int) {
    if age > 249 {
        return nil
    }
    self.init(name: name)
    }
然后直接在需要的时候使用
    //便利构造器的写法

    let label = UILabel(title: "hello, world", fontSize: 13, textColor: UIColor.red, alignMent: .left, numOfLines: 0)
    
    let label2 = UILabel(title: "hello, world")

kvc 构造器
  • 是用 kvc 来为类属性赋值的方式,完成类的构造过程的构造函数。

  • KVC 是 OC 特有的,KVC 本质上是在运行时,动态向对象发送 setValue:ForKey: 方法,为对象的属性设置数值

  • 在使用 KVC 方法之前,需要确保对象已经初始化

  • 基本数据类型,与 kvc 不兼容,在运行时找不到 key 值,需定义成必选,并赋初值才能完成构造
    class Person: NSObject {
    var name: String?
    var age: Int = 0

    //super.init() 在构造函数中, 如果没有手动添加, 则会自动添加在构造函数的最后面

    init(dict: [String: Any]) {
    super.init()
    //对象此时已创建
    setValuesForKeys(dict)
}

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

推荐阅读更多精彩内容