美文网首页
Swift中的属性

Swift中的属性

作者: 盖小聂 | 来源:发表于2019-06-28 16:36 被阅读0次

1、属性访问控制
2、属性观察
3、KVO
4、lazy修饰符和lazy方法

1、属性访问控制
  • 对于方法来说比较直接,我们想让同一module(或者说是target)中的其他代码访问的话,保持默认的internal就可以了。如果我们在为其他开发者开发库的话,可能会希望用一些public,因为在target外只能调用public的代码。而那些只希望在本文件内访问的方法,我们应该用private加以限制,以防止暴露给项目的其他部分。
  • 对于属性:
class MyClass {    
//只希望在当前文件中使用的属性
private var name: String?    
//因为set被限制为private,所以我们就可以保证name只能在当前文件进行修改。
private(set) var name: String?    
//name只能在当前文件就行修改,可以在别的module中访问这个属性。
public private(set) var name: String? 
}
2、属性观察
  • 在Swift中所有声明的属性包括存储属性和计算属性两种。其中存储属性将会在内存中实际分配地址对属性进行存储,而计算属性则不包括背后的存储,只是提供set和get两种方法。
  • 在willSet和didSet中我们分别可以使用newValue和oldValue来获取将要设定的和已经设定的值。
  • 初始化方法对属性的设定,以及在willSet和didSet中对属性的再次设定都不会再次触发属性观察的调用,一般来说这会是你所需要的行为,可以放心使用。
  • 在同一个类型中,属性观察和计算属性是不能同时共存的。也就是说,想在一个属性定义中同时出现set和willSet或didSet是一件办不到的事情。
  • 如果我们无法改动这个类,又想要通过属性观察做一些事情的话,可能就需要子类化这个类,并且重写他的属性了。重写的属性并不知道父类属性的具体实现情况,而只从父类属性中继承名字和类型,因此在子类的重载属性中我们是可以对父类的属性任意的添加属性观察的,而不用在意父类中到底是存储属性还是计算属性。
3、KVO
  • KVO我们可以实现很多松耦合的结构,使代码更加灵活和强大:像通过监听model的值来自动更新UI的绑定这样的工作,基本都是基于KVO来完成的。
  • 在Swift中我们也是可以使用KVO的,但是仅限于在NSObject的子类中。这是可以理解的,因为KVO是基于KVC以及动态派发技术实现的,而这些东西都是Objective-C运行时的概念。
  • 另外由于Swift为了效率,默认禁用了动态派发,因此想用Swift来实现KVO,我们还需要做额外的工作,那就是将想要观测的对象的属性标记为dynamic。
  • 被观察对象和观察者都必须是NSObject的子类
4、lazy修饰符和lazy方法
  • 我们在使用lazy作为属性修饰符时,只能声明属性是变量。另外我们需要显式的指定属性类型,并使用一个可以对这个属性进行赋值的语句来在首次访问属性时运行。
class ClassA {
    lazy var str: String = {
let str = “Hello”
print(“只在首次访问输出”)
return str
    }() //匿名的闭包
}
  • 为了简化,我们如果不需要做什么额外工作的话,也可以对这个lazy的属性直接写赋值语句。
lazy var str: String = “Hello”
  • 对于那些不需要完全运行,可能提前退出的情况,使用lazy来进行性能优化效果会非常有效。

相关文章

  • OC的@property与Swift的存储属性/计算属性类比

    Swift中的计算属性/存储属性与OC中的@property   Swift中引入了存储属性、计算属性的概念,存储...

  • Swift 属性

    Swift 属性 在Swift中属性主要分为存储属性、计算属性、延迟存储属性、类型属性这四种,并且Swift还提供...

  • Swift进阶(三)--- 属性

    Swift的属性 在swift中,属性主要分为以下几种: 存储属性 计算属性 延迟存储属性 类型属性 一:存储属性...

  • 浅谈 Swift 中的属性(Property)

    Properties in Swift 前言 Swift 中的属性分为存储属性与计算属性,存储属性即为我们平时常用...

  • 第10章:属性

      在Swift中枚举、结构体、类都可以有属性,属性描述了类型的某个特性。在Swift中属性从大的方面分可以分为存...

  • Swift学习-进阶02

    swift对象本质,一个swift的对象默认占用16字节大小,在内存中的结构: swift类结构: 属性 存储属性...

  • Swift 计算属性、存储属性

    属性 Swift中的属性分为存储属性(sorted variable)和计算型属性(computed variab...

  • Swift中的属性

    1. 存储属性 简单来说,每一个存储属性就是存储在特定类或结构体实例里的一个常量或变量。存储属性可以使变量存储属性...

  • Swift中的属性

      我们都知道,类是由属性和方法组成的,一般而言,属性主要是用来访问数据成员,而方法则是用来执行某些操作,比如说计...

  • swift中的属性

    属性可以将值与特定的类、结构体或者是枚举联系起来。 一、简介 存储属性与计算属性的差异: 存储属性会存储敞亮或者变...

网友评论

      本文标题:Swift中的属性

      本文链接:https://www.haomeiwen.com/subject/ekxecctx.html