zoukankan      html  css  js  c++  java
  • IOS的? !

    变量声明
    1、普通变量
    swift 像javascript一样是可以智能推断类型的,他会根据我们变量的值来推断变量的类型
    var age = 10 // Int
    var name ="lily" //编译器会自动推断出String
    static let name = "MyClass" //静态常量 通过类名直接访问 eg: ClassName.name

    2、存储型变量或者存储型属性
    语法:var variable name: type = expression

    例子:

    var str:String = "hellp world" //指定str是String类型
    var age:Int = 10 //指定为int类型
    1
    2
    你可以在全局,函数内,或者在类和结构体的声明(context)中使用这种形式来声明一个变量。当变量以这种形式 在全局或者一个函数内被声明时,它代表一个存储型变量。当它在类或者结构体中被声明时,它代表一个存储型变量属性。

    3、计算型变量和计算型属性
    语法:

    var variable name: type {
    get {
    statements
    }
    set(setter name) {
    statements
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    例子:

    private var _aa :String = ""
    var aa:String {
    get{
    return self._aa;
    }
    set{
    self._aa=newValue;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    然后在调用的时候很简单的ClassName.aa="xxx" 这个相当于调用了set ,print(ClassName.aa) 这个相当于调用了get。 当然这边set是可以接收一个参数的 ,可以不谢默认是 newValue , 也可以自己定义 ,如 set(myValue) { self._aa = myValue; } 当然我这里只是一个很简单的例子,在真实的项目中可能在get或者set值得时候需要对值进行判断或者一系列的计算后返回。根据实际项目而定。

    4、存储型变量监视器和属性监视器
    语法:

    var variable name: type = expression {
    willSet(setter name) {
    statements
    }
    didSet(setter name) {
    statements
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    例子:

    <swift>
    var age:Int = 0 {
    willSet {
    print("willset an new Value (newValue)") //willset监视器只有在变量或属性值被改变之前运行newvalue
    }
    didSet {
    print("didset an old value (oldValue) will change to age (age)") //didset监视器在变量或属性值被改变后立即运行oldvalue
    }
    }
    </swift>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    这里willset监视器只有在变量或属性值被改变之前运行。新的值作为一个常量经过过willset监视器,因此不可以在 willset语句中改变它。didset监视器在变量或属性值被改变后立即运行。和willset监视器相反,为了以防止你仍然 需要获得旧的数据,旧变量值或者属性会经过didset监视器。这意味着,如果你在变量或属性自身的didiset监视器语句 中设置了一个值,你设置的新值会取代刚刚在willset监视器中经过的那个值。

    我这里这个代码块在 Demo1 类中写的 ,调用的时候如下:

    let dm = Demo1()
    dm.age=20
    dm.age=38
    1
    2
    3
    控制台打印的结果:

    willset an new Value 20
    didset an old value 0 will change to age 20
    willset an new Value 38
    didset an old value 20 will change to age 38

    5、变量中的 ! 和 ?
    Swift里不会自动给变量赋初始值 也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化,如果没有初始化就会报错

    var str : String

    > error: variable 'str' used before being initialized
    1
    2
    3
    4
    出错的原因就是在使用str这个变量之前,没有初始化这个变量,也就是这个变量根本就没有得到内存

    这时候 我们可以使用optional类型,也就是后面跟一个?

    var str1:String?
    //如果str1 == nil 就不会调用hashValue方法 也就不会执行if语句块
    //如果str1 != nil 执行其hashValue方法 赋值给val
    if let val = str1?.hashValue
    {
    print("has value")
    }else
    {
    print("no value")
    }
    >>> 这时候 输出的是 no v alue
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ?是尝试拆包 !是强制拆包

    var str2:String?

    str2="1"
    //! 表示 确定str2一定有值 如果没有值 就会报错 一般在保证有值得情况下才会这么做
    print(str2!.hashValue) //"4799450059485597623 "
    1
    2
    3
    4
    5

    //使用这种方式声明 在调用的时候不用加? or ! ,表示 调用的时候 肯定是有值的 如果没有值 就会报错
    var str3: String!
    str3 = "111"
    print(str3.hashValue)

    6、别名
    swift支持别名使用关键字typealias

    例子 :

    typealias myInt = Int //myInt 声明为Int的别名
    var age : myInt = 10
    1
    2
    当然还有很多使用! 和 ? 的地方 如委托之类的,在这里就补赘述了,关于变量这里先总结这么多以后有更多相关会继续补充。

  • 相关阅读:
    vmware和主机通信方法
    曾经的读书计划
    Linux下的autoconf和automake
    Nor Flash读写方法
    Linux下的动态库和静态库
    asp.net读取Xml文件到DataSet,以及DataSet保存为Xml,利用自带的强大功能
    SqlServer 2000/2005 列转行 行转列收集
    GridView 模板列 在后台获取该行某控件的值 例如批量修改
    C# DllImport的用法 调用Window的一些常用功能
    C#通用数据库操作类 支持Access/MSSql/Orale/MySql等数据库
  • 原文地址:https://www.cnblogs.com/huaan011/p/14956820.html
Copyright © 2011-2022 走看看