常量和变量
  • 常量:
    • 使用let关键词来声明一个常量
    • 所指向的是一个特定类型的值,如数字10或者字符”hello”,常量的值是不能够被二次修改的
    • 编程时使用常量能够让代码看起来更加安全和简洁!
      • let name = “siri”   // 一个人的名字一般是不变的,声明为一个常量
  • 变量:
    • var关键词声明一个变量
    • 变量的值可以根据需要不断修改
      • var age = 10    // 一个人的年龄是变化的 ,声明为一个变量
        age = 20
  • 可以在一行中声明多个变量或常量
    • var x = 10.0, y = 44.0, z = 0.0
  • 类型注解:
    • 声明时注明该变量或常量的类型。 实际编程中很少需要使用类型注解,定义常量或者变量的时候Swift已经根据初始化的值确定了类型信息。Swift几乎都可以隐式的确定变量或常量的类型。如果初始化值没有被给出,更好的办法是指定变量的类型而不是让Swift隐式推导类型。
    • var name :String    // 类型注解为字符串 String
 
注意一:如果一个值在之后的代码中不会再变化,应该用let关键词将它声明为常量。变量只用来存储会更改的值。
 
变量和常量命名
  • 基本上你可以用任何你喜欢的字符作为常量和变量名
    • let 姓名 = "小飞"
      let 电话 = "123456666"
      let 😊 = "帅哥一枚"
      print("\(姓名 + 电话 + 😊)")
                      小飞123456666帅哥一枚
 
  • 常量和变量命名的注意点
    • 1、不能包含数学符号(比如+、-、*、\)
      2、不能包含箭头
      3、不能包含非法无效的Unicode字符
      4、不能是关键字
      5、不能以数字开头
      6、不能是单独一个下划线  _ 
 
整型
  • 有符号(signed):正、负、零
    • 8位、16位、32位、64位跟C语言中的相同。
    • Int:和平台相关,默认相当于OC中的NSInteger
  • 无符号(unsigned): 正、零
    • 8位、16位、32位、64位跟C语言中的相同。
    • UInt:和平台相关,默认相当于OC中的NSUInteger
  • 表示形式:
    • 1、十进制数:没有前缀
      let a1 = 10
      2、二进制数:以0b为前缀
      let a2 = 0b1010  //10
      3、八进制数:以0o为前缀
      let a3 = 0o12  //10
      4、十六进制:以0x为前缀
      let a4 = 0xA  //10
 
  • 整数边界:通过min和max属性来获取某个类型的最小值和最大值
    • let minValue = UInt8.min  // 0
      let maxValue = UInt8.max  // 255
 
浮点型
  • 如果没有明确说明类型,浮点数默认就是Double类型
  • Double:至少15位小数
  • Float:至少6位小数
    • let ffff: Float = 3.14
      let dddd = 1.23  //没有指定 默认Double
      let number0 = Double(ffff) + dddd//如果不转为Double会报错,Swift是类型安全语言,但是下面的写法是正确的
      let number1 = 3.14 + 1.23  // 因为这样写运算是先相加再赋值
 
  • 整数和浮点数转换
    • 必须显示声明
      • let three = 3
        let pointOneFourOneFiveNine = 0.14159
        let pi = Double(three) + pointOneFourOneFiveNine
 
注意:数值类型常量/变量的类型转换规则和数字类型常值的转换规则不同。常值3可以直接与常值0.14159相加,因为常值没有一个明确的类型。他们的类型是被编译器推导出来的。
 
数字格式
  • 可以增加额外的零0
    • let money = 00111 //111
      let money2 = 00111.000 //111.0
 
  • 可以增加额外的下划线 _,以增强可读性
    • let oneMillion1 = 1_000_000
      let oneMillion2 = 100_000.000_001
  • 注:增加了额外的0和下划线并不会影响原来的数值大小
 
 
类型别名
  • 类型别名:为现有类型定义的可替代名称。 使用 关键字 typealias。并且原类型能用在什么地方,别名就能用在什么地方
    • typealias MyInt = Int
  • 使用:
    • 声明变量\常量
      • let num: MyInt = 20
    • 获得类型的最值
      • let minValue = MyInt.min
    • 类型转换
      • let num = MyInt(3.14) //3
 
布尔类型
  • Swift中的布尔类型使用Bool定义,也被称为Logical(逻辑)类型,可选值是true和false,跟OC有所不同
    • let isOpen = true
      let isIn = false
  • 跟Int 和 Double 类型一样,定义布尔类型的时候不需要显式的给出数据类型,只需要直接赋值true或false即可
  • Swift的类型安全策略会防止其他非布尔类型转换为布尔类型使用
    • let i = 1
      if i {
          // error: type 'Int' does not conform to protocol 'BooleanType'
      }
 
元组类型
  • 元祖类型是一种数据结构,类似于数组或者字典,可以用于定义一组数据
  • 元组类型可以将一些不同的数据类型组装成一个元素,这些数据类型可以是任意类型,并且不需要是同样的类型。
 
  • 元祖的定义:写法一
    • let http404Error = (404, "Not Found”)  // 这个元祖可以描述为类型(Int,String)的元祖
  • 元祖的定义:写法二(直接指定每个元素的名称,然后直接使用元组名.元素名访问)
    • let http200Status = (statusCode: 200, description: "OK")
      print("The status code is \(http200Status.statusCode)")
      print("The status message is \(http200Status.description)")
  • 元祖的定义:写法三
    • let (errorCode, errorIno) = (404, "Not Found")
      print(errorCode)
      print(errorIno)
 
  • 元祖的访问
    • let http404Error = (404, "Not Found")
      let (statusCode, statusMessage) = http404Error
      print("The status code is \(statusCode)")
      print("The status message is \(statusMessage)")
            The status code is 404
            The status message is Not Found
 
  • 如果仅需要元组中的个别值,可以使用(_)来忽略不需要的值
    • let (statusCode1, _) = http404Error
    • 也可以使用元素序号来选择元组中的值,注意序号是从0开始的
      • print("The status code is \(http404Error.0)")
                    The status code is 404
 
可选类型
  • 在一个值可能不存在的时候,可以使用可选类型。这种类型的定义是:要么存在这个值并且等于X,要么这个值不存在。
  • 在OC中有一种相似的类型—-nil,但仅对对象有用,其他情况返回一个特殊值(比如NSNotFound)来表明这个值不存在。
  • Swift中nil也是一个特殊的类型,但是因为和真实的类型不匹配不能赋值
 
  • 可选类型的写法:由于可选类型都会要改变的,所以定义用 var
    • 写法一:
      • var mySrr1 : Optional<String> = nil
    • 写法二:
      • var myStr2 : String? = nil
 
  • 可选类型赋值
    • var myName : Optional<String>
      myName = "Siri"
      //错误写法    myName 是可选类型,不能直接和字符串拼接
      let info = "my name is " + myName  // 会有下面的错误提示
     
 
  • 可选类型赋值:可选类型+!,强制解包
    • let info = "my name is " + myName!
  • 注意:如果可选类型为nil 强制解包 会拨错
    • var herName : String?
      herName = "Siri"

      print(herName) // 可选类型,打印会带Optional
      print(herName!)
      herName = nil
      print(herName!)  // 报错
                     Optional("Siri”)  
            Siri
            fatal error: unexpectedly found nil while unwrapping an Optional value
                    // 正确写法
            ifherName != nil {
                print(herName!)     
            }
             // 简单写法:为了让在if语句中可以方便使用string
             ifvar str = herName {
                  print(str)
             }
 
选择绑定
  • 选择绑定帮助确定一个可选值是不是包含了一个值,如果包含,把该值转化成一个临时常量或者变量。选择绑定可以用在if或while语句中,用来在可选类型外部检查是否有值并提取可能的值
  • 常量和变量都可以用来做可选绑定。如果你想要在if第一个分支修改personAge的值,用var 修饰personAge
    • class Person {
          var name = "Siri"
          var age : Int?
      }
      var person = Person()
      if let personAge = person.age {   // 必须是可选值
          print("有值")
      } else {
          print("没值")
      }
      没值
 
nil
  • Swift中,nil不是指针而是一个特定类型的空值。任何类型的可选变量都可以被设为nil,不光是指针。 
 
 
隐式解包可选类型
  • 直接在类型后面加! 来指定
  • 隐式解包的可选类型主要用在一个变量/常量在定义瞬间完成之后值一定会存在的情况。这主要用在类的初始化过程中
  • 隐式解包的可选类型本质是可选类型,但是可以被当成一般类型来使用,不需要每次验证值是否存在
    • let possibleString: String? = "An optional string."
      print(possibleString!)

      let assumedString: String! = "An implicitly unwrapped optional string."
      print(assumedString)
  • 注意:如果一个隐式解包的可选类型不包含一个实际值,那么对它的访问会抛出一个运行时错误。在变量/常量名后面加!的情况也是一样的。
  • 你可以把解包可选类型当成正常的可选类型来探测是否有值。
    • if (assumedString != nil) {
          print(assumedString)
      }
  • 或者通过类型绑定检查
    • if let definiteString = assumedString {
          print(definiteString)
      }
注意:如果一个可选类型存在没有值的可能的话,不应该使用解包可选类型。这种情况下,一定要使用正常的可选类型。
 
 
断言
  • 可选类型:让编程人员可以在运行期检测一个值是否存在,然后使用代码来处理不存在的情况
  • 断言:如果一个值 不存在或者值不满足条件会直接影响代码的执行,使用断言结束程序的执行从而提供调试的依据。
  • 使用全局函数assert来使用断言调试,assert函数接受一个布尔表达式和一个断言失败时显示的消息
    • let age = 19
      assert(age >= 18, "未成年”)  //如果条件为 false 程序崩溃,错误日志:未成年。错误日志也可以省略 
    
 
  • 断言使用时机:
    • 传递一个整数类型下标的时候,比如作为数组的Index,这个值可能太小或者太大,从而造成数组越界;
    • 传递给函数的参数,但是一个无效的参数将不能在该函数中执行
    • 一个可选类型现在是nil,但是在接下来的代码中,需要是非nil的值才能够继续运行。
 
posted on 2016-06-27 14:01  怡情_老二  阅读(388)  评论(0编辑  收藏  举报