属性的存储

属性的主要作用是存储数据,可以常量属性和变量属 性;

  1. struct FixedLengthRange {
  2. var firstValue: Int let length: Int
  3. }
  4. var rangeOfThreeItems =FixedLengthRange(firstValue: 0,
  5. length: 3)
  6. // the range represents integer values 0, 1, and2 rangeOfThreeItems.firstValue = 6
  7. // the range now represents integer values 6, 7, and 8

但是 rangeOfFourItems 实例为常量属性也是不可以修改的。

l

  1. et rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
  2. // this range represents integer values 0, 1, 2, and 3 rangeOfFourItems.firstValue = 6

延时存储属性

延时存储属性是初始化时候不分配值,直到第一次使 用它。

属性@lazy 声明。

  1. class DataImporter {
  2. /*
  3. DataImporter is a class to import data from anexternalfile.
  4. The   class  is assumed     to  take  a  non-trivial amount of time toinitialize.
  5. */
  6. var fileName = "data.txt"
  7. // the  DataImporter   class  would   provide  dataimporting functionality here
  8. }
  9. class DataManager {
  10. @lazy varimporter= DataImporter()
  11. var data = ""
  12. // the DataManager class would provide data management functionality here
  13. }
  14. let manager= DataManager() manager.data += "Some data" manager.data += "Some more data"
  15. println(manager.importer.fileName)

计算属性

有的时候一些属性是通过其他的属性计算得出的,通 过 get 和 set 访问器对其访问。

  1. //定义 Point struct Point {
  2. var x =0.0, y = 0.0
  3. }
  4. //定义 Size struct Size {
  5. var width = 0.0, height = 0.0
  6. }
  7. //定义 Rect struct Rect {
  8. var origin = Point()
  9. var size = Size()
  10. var center: Point {
  11. get {
  12. let centerX = origin.x+ (size.width / 2)
  13. let centerY = origin.y + (size.height / 2)
  14. return Point(x: centerX, y: centerY)
  15. }
  16. set(newCenter) {
  17. origin.x = newCenter.x - (size.width / 2)
  18. origin.y = newCenter.y - (size.height / 2)
  19. }
  20. }
  21. }
  22. var square =Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0,height: 10.0))
  23. let initialSquareCenter =square.center square.center = Point(x: 15.0, y: 15.0) println("square.origin is  now    at  (\(square.origin.x),
  24. \(square.origin.y))")

属性观察者

为了监听属性的变化,swift 通过了属性观察者。

• willSet 观察者是在存储之前调用。

• didSet 新值存储后调用。

  1. class StepCounter {
  2. var totalSteps: Int = 0{
  3. willSet(newTotalSteps) {
  4. println("About    to    set    totalSteps    to
  5. \(newTotalSteps)")
  6. }
  7. didSet {
  8. if totalSteps >oldValue   {
  9. steps")
  10. }
  11. println("Added   \(totalSteps  - oldValue)
  12. }
  13. let stepCounter = StepCounter()
  14. stepCounter.totalSteps = 200
  15. // About to set totalStepsto 200
  16. // Added200steps stepCounter.totalSteps = 360
  17. // About to set totalStepsto 360
  18. // Added160steps stepCounter.totalSteps = 896
  19. // About to set totalStepsto 896
  20. // Added536steps

静态属性

静态属性在结构体中使用 static 定义,类中使用 class

定义。

  1. struct SomeStructure {
  2. static var storedTypeProperty = "Some value."static var computedTypeProperty: Int{
  3. // return anInt value here
  4. }
  5. }
  6. class SomeClass {
  7. class varcomputedTypeProperty: Int {
  8. // return anInt value here
  9. }
  10. }

调用的时候可以直接使用类和结构体名调用。 实例:

  1. struct AudioChannel {
  2. static letthresholdLevel= 10
  3. static var maxInputLevelForAllChannels= 0 var currentLevel:Int = 0 {
  4. didSet {
  5. if               currentLevel                 > AudioChannel.thresholdLevel {
  6. // cap   the  new   audio   level  to  the threshold level
  7. currentLevel                             = AudioChannel.thresholdLevel
  8. if               currentLevel                 > AudioChannel.maxInputLevelForAllChannels {
  9. // storethis as the new overall maximum input level
  10. AudioChannel.maxInputLevelForAllChannels          =
  11. currentLevel
  12. }
  13. }
  14. }
  15. }
  16. var leftChannel =AudioChannel()
  17. var rightChannel =AudioChannel()
  18. leftChannel.currentLevel = 7println(leftChannel.currentLevel)
  19. // prints "7"
  20. println(AudioChannel.maxInputLevelForAllChannels)

Swift交流讨论论坛论坛:http://www.cocoagame.net

欢迎加入Swift技术交流群:362298485

 

Swift属性的更多相关文章

  1. swift 属性

    属性将值和类,结构,枚举相关联.属性分为计算属性和存储属性.存储属性存储常量或变量作为实例的一部分 ,计算属性计算一个值.存储属性用于类和结构体,计算属性用于类,结构体和枚举. 1:存储属性 存储属性 ...

  2. Swift—属性观察者-备

    为了监听属性的变化,Swift提供了属性观察者.属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到. 属性观察者主要有以下两个: willSet:观察者在修改之前调用. didSe ...

  3. swift 属性和方法

    属性和常量 如果创建了一个结构体的实例并赋值给一个常量,则无法修改实例的任何属性: let rangeOfFourItems = FixedLengthRange(firstValue: 0, len ...

  4. 学习swift从青铜到王者之swift属性09

    1.结构体常量和类常量的存储属性 let p1 = Person1() //p1.age = 88 不允许修改 //p11.name = "yhx1" 不允许修改 var p11 ...

  5. swift属性观察者机智

    为了让程序能在属性被赋值时获得执行代码的机会.swift提供了属性观察者机智,属性观察者其实就两个特殊的回调方法 willSet:被观察的属性即将被赋值之前自动调用该方法 didSet:被观察的属性被 ...

  6. Swift - 属性观察者(willSet与didSet)

    属性观察者,类似于触发器.用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应.有如下特点: 1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet. ...

  7. Swift 属性 函数

    如今看cocoachina上得文章越来越有质量了,果断分享一下  原文: http://www.cocoachina.com/newbie/basic/2014/0611/8773.html 函数 函 ...

  8. swift 属性值变化

    如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改该实例的任何属性,即使有属性被声明为变量也不行. 这种行为是由于结构体(struct)属于值类型.当值类型的实例被声明为常量的时候,它的所有属 ...

  9. Swift学习笔记 - Swift属性只读

    在OC中我们经常用到只读属性,用readonly修饰一下就行了,但在Swift中已经不是这样修饰的了,下面记录一下Swift中只读属性的使用 在OC中的只读: //只读属性 @property(rea ...

随机推荐

  1. IE自动化

    自动打开www.baidu.com,并搜索关键字“abcd” #定义函数:等待页面打开 function WaitForLoad($ie) { sleep 2 do {Sleep -Mi 200} w ...

  2. Galera 10.0.20 on CentOS 6.6

    Galera 10.0.20 on CentOS 6.6 0.使用场景 数据库软件:mariadb-galera-10.0.20-linux-x86_64.tar.gz 集群管理:galera-3-2 ...

  3. cocos2d-x 资源路径研究

    调用cc.FileUtils:getInstance():addSearchResolutionsOrder("src"); 加入�一个搜索路径,就能够直接载入src文件夹下的资源 ...

  4. 统计0到n之间1的个数

    问题描写叙述 给定一个十进制整数N,求出从1到N的全部整数中出现"1"的个数. 比如:N=2时 1,2出现了1个 "1" . N=12时 1,2,3,4,5,6 ...

  5. ABAP OO的八大理由

    原贴地址:http://scnblogs.techweb.com.cn/abaplv/archives/127.html 几年前SAP BASIS 4.6为ABAP扩展了OO功能,这是很多传统的ABA ...

  6. Computer Science Theory for the Information Age-6: 学习理论——VC定理的证明

    VC定理的证明 本文讨论VC理论的证明,其主要内容就是证明VC理论的两个定理,所以内容非常的枯燥,但对于充实一下自己的理论知识也是有帮助的.另外,VC理论属于比较难也比较抽象的知识,所以我总结的这些证 ...

  7. apache配置--虚拟目录

    apache在httpd-vhosts.conf中 配置二级域名或者泛域名: <VirtualHost *:80>    ServerAdmin 846606478@qq.com    D ...

  8. 基础知识 - Rabin-Karp 算法

    Rabin-Karp 算法(字符串快速查找) Go 语言的 strings 包(strings.go)中用到了 Rabin-Karp 算法.Rabin-Karp 算法是基于这样的思路:即把字符串看作是 ...

  9. 修改范围PHP_INI_SYSTEM与PHP_INI_ALL的区别

    PHP_INI_USER 可在用户脚本(例如 ini_set() )或 Windows 注册表(自 PHP 5.3 起)以及 .user.ini 中设定 PHP_INI_PERDIR 可在 php.i ...

  10. Linux 学习笔记 查看文件内容诸多命令

    查看文件内容 1.查看文件统计信息 stat 提供文件系统上某个文件的所有状态信息 2.查看文件类型 file 用来查看文件类型 (该命令将文件分成3类:文本类型:可执行文件:数据文件) 如果你有从未 ...