存储属性和计算属性

类、结构和枚举都能够定义存储属性和计算属性。其中存储属性就是常见的形式,又分为变量属性和常量属性,如:

  1. struct Point {
  2. var x = 0.0, y = 0.0
  3. }
  4. struct Size {
  5. var width = 0.0, height = 0.0
  6. }

计算属性本身不是一个值,但是它提供gettersetter来间接地使用和设置存储属性的值:

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

上面例子中的center就是一个计算属性

如果只有getter没有setter,那这个计算属性就是只读计算属性。

属性观察者

属性观察者可以根据属性值的变化做出响应,当代码尝试修改属性的值时就会被条用,主要有两种: willSet:设置属性前被调用; didSet:设置属性后被调用:

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

类型属性

跟实例属性一样,类、结构和枚举类型还可以定义类型属性,在Swift中需要放在类型定义中进行,结构和枚举用关键词static定义,类用class关键词定义类型属性:

  1. struct SomeStructure {
  2. static var storedTypeProperty = "Some value."
  3. static var computedTypeProperty: Int {
  4. // return an Int value here
  5. }
  6. }
  7. enum SomeEnumeration {
  8. static var storedTypeProperty = "Some value."
  9. static var computedTypeProperty: Int {
  10. // return an Int value here
  11. }
  12. }
  13. class SomeClass {
  14. class var computedTypeProperty: Int {
  15. // return an Int value here
  16. }
  17. }

在使用的时候,可以直接用类名.属性名的形式来调用:

  1. println(SomeClass.computedTypeProperty)
  2. // prints "42"
  3. println(SomeStructure.storedTypeProperty)
  4. // prints "Some value."
  5. SomeStructure.storedTypeProperty = "Another value."
  6. println(SomeStructure.storedTypeProperty)
  7. // prints "Another value.

方法

Swift中除了类可以定义方法以外,结构和枚举也可以定义方法:

  1. struct Point {
  2. var x = 0.0, y = 0.0
  3. func isToTheRightOfX(x: Double) -> Bool {
  4. return self.x > x
  5. }
  6. }
  7. let somePoint = Point(x: 4.0, y: 5.0)
  8. if somePoint.isToTheRightOfX(1.0) {
  9. println("This point is to the right of the line where x == 1.0")
  10. }
  11. // prints "This point is to the right of the line where x == 1.0"

类型方法

和类型属性类似,类、结构和枚举还可以定义类型方法,也是分别使用staticclass关键词定义:

  1. class SomeClass {
  2. class func someTypeMethod() {
  3. // type method implementation goes here
  4. }
  5. }
  6. SomeClass.someTypeMethod()

下标

Swift中的下标可以定义更加复杂的功能,用下面这个例子来说明:

  1. struct Matrix {
  2. let rows: Int, columns: Int
  3. var grid: Double[]
  4. init(rows: Int, columns: Int) {
  5. self.rows = rows
  6. self.columns = columns
  7. grid = Array(count: rows * columns, repeatedValue: 0.0)
  8. }
  9. func indexIsValidForRow(row: Int, column: Int) -> Bool {
  10. return row >= 0 && row < rows && column >= 0 && column < columns
  11. }
  12. subscript(row: Int, column: Int) -> Double {
  13. get {
  14. assert(indexIsValidForRow(row, column: column), "Index out of range")
  15. return grid[(row * columns) + column]
  16. }
  17. set {
  18. assert(indexIsValidForRow(row, column: column), "Index out of range")
  19. grid[(row * columns) + column] = newValue
  20. }
  21. }
  22. }

这个矩阵定义了一个二维的下标,分别接受两个Int类型的参数,返回一个Double值,其中getset分别是取值和赋值时会做的操作。

Swift-属性、方法、下标的更多相关文章

  1. 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  2. Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  3. swift 属性和方法

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

  4. JS中的内置对象简介与简单的属性方法

    JS中的数组: 1.数组的概念: 数组是在内存中连续存储的多个有序元素的结构,元素的顺序称为下标,通过下标查找对应元素 2.数组的声明: ①通过字面量声明var arr1 = [,,,,] JS中同一 ...

  5. 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  6. Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  7. HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48   <audio> 标签属性:src:音乐的URLpreload:预加载au ...

  8. python7 静态方法、类方法、属性方法 ;反射;异常处理

      #-*- coding:utf8 -*- # 静态方法@staticmethod # 静态方法(当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了.) clas ...

  9. Delphi中TStringList类常用属性方法详解

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...

  10. React-Native的基本控件属性方法

    对React-Native的学习,从熟悉基本控件开始. View 属性方法 序号 名称 属性Or方法 类型 说明 1 accessibilityLabel 属性 string   2 accessib ...

随机推荐

  1. LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解

    题目: Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from lef ...

  2. uboot在nandflash存储时内存和NandFlash存储空间

    硬件采用nandflash,nandflash为8位数据宽度,没有dataflash和norflash. Nandflash空间分配为 bootstrap + u-boot + env + linux ...

  3. 刘昕明:送给和我一样曾经浮躁过的PHP程序员

    作者注:2012年偶决定开始写博客了,不为别的,就希望可以通过博客记录我的成长历程同时也希望可以帮助一些刚毕业,刚入行业的兄弟姐们们.我们是一群充满浮躁.抱怨.迷茫的程序猿,想一想3年就这么过去了,社 ...

  4. Linux 精确获取指定目录对应的块的剩余空间

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/statfs ...

  5. 第三百一十二节,Django框架,Cookie

    第三百一十二节,Django框架,Cookie 注意:获取Cookie是在请求对象里处理,设置Cookie是在响应对象里处理 普通Cookieset_cookie()设置普通cookie 参数: ke ...

  6. c# combobox 绑定报错

    comboBoxPlanResult.DataSource =new BindingSource(o,null);comboBoxPlanResult.DisplayMember ="Key ...

  7. php -- 实现linux关机、重启功能

    有时候,我们自己可以DIY一个控制面板实现linux的关机重启功能.众所周知,linux是一个基于文件的操作系统,所以要实现系统的关机重启功能必须满足以下两点 一.知道命令的绝对路径 在linux下操 ...

  8. (转)JavaScript内存模型

    JavaScript对象内存模型 转自:http://blog.csdn.net/u010425776/article/details/53617292  推荐-JavaScript作用域链内存模型: ...

  9. Windows性能监视器

    前端时间在做动态目标监控,应用程序需要考虑大数据量和多用户并发的操作,系统的性能是解决方案实施性的重要度量.这里简单的记录下Windows中性能监视查看和简单分析. 一般操作系统性能主要涉及到的问题主 ...

  10. Error 2 error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)'

    Error 2 error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree ...