swift 属性和方法

时间:2014-07-22 08:00:06   收藏:0   阅读:310

属性和常量

如果创建了一个结构体的实例并赋值给一个常量,则无法修改实例的任何属性:

let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
rangeOfFourItems.firstValue = 6

延迟属性

什么时候使用延迟属性?
当属性的值依赖于在实例的构造过程结束前无法知道具体值的外部因素时
当属性的值需要复杂或大量计算时,可以只在需要的时候来计算它
class DataManager {
    @lazy var importer = DataImporter()
    var data = String[]()
    // 这是提供数据管理功能
}

计算属性:getter和setter

如果计算属性的 setter 没有定义表示新值的参数名,则可以使用默认名称newValue。
必须使用var关键字定义计算属性,包括只读计算属性,因为它们的值不是固定的。let关键字只用来声明常量属性,表示初始化后再也无法修改的值。

struct Rect{

    var _center:String;

    var center: String {
    get {
        return _center;
    }
    set (newCenter){
        _center = newCenter
    }
    }

}

//使用newValue
struct Rect2{

    var _center:String;

    var center: String {
    get {
        return _center;
    }

    set{
        _center = newValue
    }
    }

}

属性观察器

属性观察器:

  struct Test{
    var test:Int = 0{
    willSet {
        println(newValue)
    }
    didSet{
        println(oldValue)
    }
    }
}
var a = Test();
a.test = 5;

全局变量,局部变量和延迟属性,计算属性,属性观察器

全局或局部变量都属于存储型变量,跟存储属性类似,它提供特定类型的存储空间,并允许读取和写入。

var test:Int = 0{
willSet {
    println(newValue)
}
didSet{
    println(oldValue)
}
}

test  = 5 ;

var str:String{
get{
    return String(test);
}
set {
test = newValue.toInt()!+5
}
}
println(str);
str = "4";
println(str)

类型属性---静态属性

使用关键字static来定义值类型的类型属性,关键字class来为类(class)定义类型属性:

struct SomeStructure {
      static var storedTypeProperty = "Some value."
      static var computedTypeProperty: Int {
      // 这里返回一个 Int 值
      }
}

enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
    // 这里返回一个 Int 值
    }
}

class SomeClass {
    class var computedTypeProperty: Int {
    // 这里返回一个 Int 值
    }
}

类型属性是通过类型本身来获取和设置,而不是通过实例。

println(SomeClass.computedTypeProperty)
// 输出 "42"

println(SomeStructure.storedTypeProperty)
// 输出 "Some value."
SomeStructure.storedTypeProperty = "Another value."
println(SomeStructure.storedTypeProperty)
// 输出 "Another value.”

self 和 parent

  struct Point {
  var x = 0.0, y = 0.0
  mutating func moveByX(deltaX: Double, y deltaY: Double) {
    self = Point(x: x + deltaX, y: y + deltaY)
  }
}


enum TriStateSwitch {
  case Off, Low, High
  mutating func next() {
    switch self {
    case Off:
      self = Low
    case Low:
      self = High
    case High:
      self = Off
    }
  }
}
var ovenLight = TriStateSwitch.Low
ovenLight.next()
// ovenLight 现在等于 .High
ovenLight.next()
// ovenLight 现在等于 .Off

变异 mutating

  struct Point {
  var x = 0.0, y = 0.0
  mutating func moveByX(deltaX: Double, y deltaY: Double) {
    x += deltaX
    y += deltaY
  }
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveByX(2.0, y: 3.0)

实例方法

Swift 中方法的名称通常用一个介词指向方法的第一个参数,比如:with,for,by等等。
关于方法的外部参数:

class Counter {
  var count: Int = 0
  func incrementBy(amount: Int, numberOfTimes: Int) {
    count += amount * numberOfTimes
  }
}

let counter = Counter()
counter.incrementBy(5, numberOfTimes: 3)

类型方法--静态方法

声明类的类型方法,在方法的func关键字之前加上关键字class;声明结构体和枚举的类型方法,在方法的func关键字之前加上关键字static。

struct LevelTracker {
  static var highestUnlockedLevel = 1
  static func unlockLevel(level: Int) {
    if level > highestUnlockedLevel { highestUnlockedLevel = level }
  }
  static func levelIsUnlocked(level: Int) -> Bool {
    return level <= highestUnlockedLevel
  }
  var currentLevel = 1
  mutating func advanceToLevel(level: Int) -> Bool {
    if LevelTracker.levelIsUnlocked(level) {
      currentLevel = level
      return true
    } else {
      return false
    }
  }
}

swift 属性和方法,布布扣,bubuko.com

原文:http://www.cnblogs.com/zhepama/p/3857576.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!