LoginSignup
0
0

More than 5 years have passed since last update.

变量和简单类型

对于变量来说就好比它是一个鞋盒子,它包含了一个严格定义的单个值. 每一个变量都需要显式正式的定义. 要想将一个对象塞进鞋盒子, 就需要让这个变量指向这个对象. 这里我们说说如何定义和初始化一个变量.还有会说道一些内置的简单类型.(之所以说简单是相对于集合这样的复杂类型,之后会说到_)

  • Variable Scope and Lifetime
  • Variable Declaration
  • Computed Initializer
  • Computed Variables
  • Setter Observers
  • Lazy Initialization
  • Built-In Simple Types

变量的作用域和生命周期

全局变量

定义在一个swift 文件顶层的变量就是全局的变量.

属性

属性是对于那些定义在顶层的对象类型(类,枚举或者结构)来说的,有2中属性,一是实例的属性,二是静态/类 属性.

  • 实例属性

    默认的来说, 一个属性它就是实例的属性,

  • 静态/类属性

    就是在定义他们的时候通过 static 或者 class 关键字来修饰的属性.

看下面的代码

// File1:
class Dog {
    static let staticProperty = "staticProperty"
    let instanceProperty = "instanceProperty"
    func printInstanceProperty() {
        print(self.instanceProperty) // *
    }
}
// File2:
class Cat {
    func printDogStaticProperty() {
        print(Dog.staticProperty) // *
    }
    func printDogInstanceProperty() {
        let d = Dog()
        print(d.instanceProperty) // *
    }
}

本地变量

在函数体内的变量我们就称之为本地的变量,一个本地的变量它的生存范围就是在{}之间.

class Dog {
    func printLocalVariable() {
        let localVariable = "local"
        print(localVariable) // *
    }
}

定义变量

可以通过let 或者var 来定义变量区别在于:

  • 通过let, 变量将会变成常理, 意味着它的值不会再变.
  • 通过var, 它就是真正意义的 变量.

而一旦定义变量他们的类型是不能够改变的. 尽管他们的值是可以修改但是这些值都应该是一类的.

定义变量三种方法:

  • var x:Int
  • var x = 1
  • var s:Int = 1

推荐第三种显式给类型并初始化.

计算生成的初始化方法

有些时候你需要执行那么几行代码来给一个变量初始值, 一个简单的方法就是通过匿名函数立即执行的方式来实现:

let times: Bool  = {
  if val == 1 {
    return true
  } else {
    return false
  }
}

计算生成的变量

setter 方法

var now : String { 
    get { 
        return Date().description 
    }
    set { 
        print(newValue) 
    }
}

setter监视

swift 同样有另外一个特性就是能够 hook 进去一些方法来监视 set 方法.

var s = "whatever" { 
    willSet { 
        print(newValue) 
    }
    didSet { 
        print(oldValue) 
        // self.s = "something else"
    }
}

惰性初始化

  • 全局变量, 默认惰性初始化. 对于全局变量来说当 app 启动的时候完全没有必要初始化, 因为程序还是没有跑起来呢,所以延迟到之后的某个步骤才合适.
  • 静态属性, 默认也是延迟.
  • 实例属性, 默认并不是延迟的, 但是可以通过lazy 关键字来让它延迟.而且必须要var 来声明.

内置简单类型

  • Bool var selected : Bool = false
  • Numbers

    • Int
    • Double
    • 数字转换
    • 运算符
    • 比较
  • String

  • Character

  • Range

  • Tuple

  • Optional

    • umwrapped optional
    • implicitly unwrapped optional
let stringMaybe : String? = "howdy"
let upper = stringMaybe.uppercased() // compile error

上面的代码里的stringMayBe 其他它是 Optional 封装过的. 你要让它当 string 你需要解出来

let stringMaybe : String? = "howdy"
let upper = stringMaybe!.uppercased()
func realStringExpecter(_ s:String) {}
var stringMaybe : String! = "howdy"
realStringExpecter(stringMaybe) // no problem
  • 好神奇的 Nil
var stringMaybe : String? = "Howdy"
print(stringMaybe) // Optional("Howdy")
if stringMaybe == nil {
    print("it is empty") // does not print
}
stringMaybe = nil
print(stringMaybe) // nil
if stringMaybe == nil {
    print("it is empty") // prints
}

  • Optional Chains
let stringMaybe : String? = "howdy"
let upper = stringMaybe!.uppercased()
  • optional 的对象比较
let s : String? = "Howdy"
if s == "Howdy" { // ... they _are_ equal!

为什么需要 Optional

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0