美文网首页
Swift(一 标识符 运算符 数据类型 字符串)

Swift(一 标识符 运算符 数据类型 字符串)

作者: DSA碼侬 | 来源:发表于2017-07-13 14:24 被阅读215次

    注:近期学习swift,看的是人民邮电出版的《从零开始学习Swift3》(小差错不少),目前只看到了前几章。每章的知识点 琐碎,同时存在与其他语言易混淆的部分,不常用的难理解的部分记录下来。

    第一章

    1、函数签名:

    是由函数(或者方法)的名称和参数标签组成,不包括返回值与参数类型。

    在Swift3之后,调用函数 时要求指定所有参数的标签,除非函数定义时,使用下划线(_)关键字声明标签。
      //1、 函数标签:rectangleArea(W:H:)  调用时候,如果没有W H,参数标签就是width与height
    func rectangleArea(W width:Double, H height: Double) -> Double{
    let area = width * height
    return area
    }
    // 调用
    rectangleArea(W: 1, H: 2)
    
    //2、 函数标签:rectangleArea(_:H:)
    func rectangleArea(_ width:Double, H height: Double) -> Double{
    let area = width * height
    return area
    }
    // 调用
    rectangleArea(1, H: 2)
    上函数中,WH_是参数标签,width height是参数名。参数名是在函数或者方法内部使用的名字,参数标签是在函数或者方法调用时使用的参数名。   
    
    2、Swift的开发工具:

    xcode开发工具;AppCode最优秀的第三方开发工具。
    AppCode是付费软件。Xcode是主流。
    在xcode代码编辑区域,如果想查询比较完整全面的帮助文档,可以按住Alt键双击某个方法,打开XcodeAPI帮助搜索结果窗口。

    第二章

    1、编写与运行swift方式

    1.1 交互式方式运行(REPL 或者 Playground)
    1.2 编译为可执行文件方式运行(iOS 或者 macOS工程)

    REPL:Read-Eval-Print Loop--读取求值输出循环
    启动Swift: 直接在终端输入swift回车即可(xcode6 输入xcrun swift)
    退出::exit或 :quit
    通过Xcode创建macOS工程 就是创建Command Line Tool命令行

    第三章

    1、标识符

    区分大小写,可以是字母、数字、下划线、中文、表情,首字母不是是数字。
    关键字作为标识符,必须加上重音符号,重音符号不是标识符的一部分。

     let `class` = "123" // ``也可以用于其他标识符,`a`与a是等价的
     let `a100` = "1"
      print(a100)  // 打印 1
    
    2、关键字

    关键字是区分大小写的。下划线(_)关键字表示模式匹配,可以替换任何字符。

    3、常量let 变量var

    常量只能初始化一次,可以带上类型先定义,再赋值也是可行的。变量声明时候如果不写类型必须初始化。要么不初始化,但是必须加上类型。

    var var01 = 100;
    var var02 : String
    var var03  // var var03  编译失败
    

    let和var关键字声明时候,原则上优先使用let。可以防止程序运行过程中不必要的修改并提高程序的可读性。不能修改let变量的值,但是可以通过指针获得对象后,修改对象内部的属性。

    特别注意,引用数据类型声明时,经常采用let声明,虽然从业务层面来讲并不需要一个常量,但是使用let可以防止引用数据类型在程序运行过程中被错误地修改。
    4、注释 表达式

    // 单行注释; /**/ 块注释;Swift的多行注释可以嵌套。表达式在声明变量和常量时候不要指定数据类型。因为这样程序代码非常简洁,但有时需要指定特殊的数据类型,例如var a:Int16 = 10代码。对应语句结束后的分号不是必须情况下也不要加。多语句写在一行上要加分号。

    第四章

    1、一元运算符 二元运算符

    swift不存在a++ ++a --a a--等运算符,应该使用a += 1 a-=1替换。二元运算符中浮点数取余运算的时候%不能使用。整数可以。用浮点数的truncatingRemainder(dividingBy: )函数进行取余运算。

    2、算术赋值运算符

    += 加赋值, -= 减赋值, *=乘赋值, /= 除赋值, %=取余赋值。

    3、关系运算符

    === 恒等于 主要用于引用类型数据比较 eg:a === b a与b引用同一个实例时候返回true 否则返回false,比较两个引用的内容是否为同一个实例。 !== 与===相反 不恒等于

    4、位运算符

    “~” 位反:按位取反
    “&” 位与:两位全部为1,这一位才为1
    “|” 位或:只要有一个为1 这一位就是1
    “^” 位异或:两位相反时这一位才为1
    “>>”右移:比如UInt8,右移之后,(超出8位)右边两位去除,高位补零。
    “<<”左移:比如UInt8,左移之后,(超出8位)左边两位去除,低位补零。

    第五章

    1、Swift的数据类型

    整型、浮点型、布尔型、字符、字符串(String)、元组、集合、枚举、结构体属于值类型

    • Int8相当于OC的char Int16相当于OC的short Int32相当于int Int64相当于OC的long Int相当于OC的NSInteger
      类属于引用类型
    2、浮点型

    浮点型主要用来存储小数数值,也可以用来存储范围较大的整数。默认的浮点数是Double类型

    var vard:Double = 2553333
    
    3、数字表示方式

    3.1 进制表示
    二进制数:0b 0b11100 (28)
    八进制数:0o 0o34(28)
    十六进制数:0x 0x1C (28)
    3.2 指数表示
    十进制指数: 3.36e2 (3.36 * 10的2次幂)
    还有补零、添加下划线表示的形式 都是可以的。

    4、整型之间的转换

    Swift中,不同类型的变量/常量 不能相互运算,编译失败。必须显示转换(利用构造函数)

    let historyScore:UInt8 = 90
    let englishScore:UInt16 = 130
    let totalScore = UInt16(historyScore) + englishScore
    
    注:一般提倡小范围转大范围,不提倡大范围转小范围,可能会造成精度的丢失,甚至运行异常。

    整型与浮点数类型转换和上文类似。

    5、布尔型

    在Swift中,布尔类型只有两个值 true false

    6、元组类型

    元组是一种数据结构,元组就像一条表的记录,各字段类型不必相同。元组在作为函数返回多值时尤其重要。在分解元组时候 不需要的字段可以用下划线"_"代替:

     // 写法
     let info = ("123", 18)
     let info1 = (name: "123" , age: 18)
     let  (name, age) = ("123", 18)
    
     var student = (id:"1002", name:"zhangsan",english_score:32,chinese_score:80)
     let (id1,name1,_,_) = student
     print(id1,name1, student.0, student.id) // .键值(键存在时)  .下标都可以访问
    
    7、可选类型

    Swift所有的数据类型声明的变量或者常量都不能为空值(nil)
    如果一个变量/常量的值 可能为空 可能不为空,就用当前类型的可选类型 Int->Int? Int!
    可选类型的存在主要是因为Swift是强类型,Int类型的 除了能存储整型数据,其他都不可以存储, 包括nil。
    Int?是对Int的一层包装,它们是2种不同的数据类型。可以直接将Int类型赋值给Int?类型(小->大)
    如果某个变量一直有值 就用普通类型
    如果不确定是否有值就用可选类型:? !
    "?": 开始不确定有没有值的存在,拆包时候需要用感叹号!拆包 (显示拆包)
    "!": 一般是开始确定一定有值,拆包时候 省略感叹号! (隐式拆包)

       let n1:Int? = 10       // 可选类型
       print(n1!)             // 显式拆包 / 强制拆包
       var n2:Int! = 10       // 隐式拆包可选类型
       print(n2)              // 隐式拆包
       var n3:Int?
       print(n3!)             // 不正确,!强制拆包  some必须有值--fatal error: unexpectedly found nil while unwrapping an Optional value(可选类型打印是Optional(xxx))
    

    可选绑定:选择性的赋值,如果可选类型值存在 就自动解包赋值给一个常量或者变量,如果可选类型值不存在,就不创建这个常量或者变量

         // 方法
        func n1Value(n: Int)->Int?
        {
              if n == 0 {
                   return nil
             }else {
            return n
           }
        }
        // 可以自动解包,n0就是解包后的Int类型
      if let n0 = n1Value(n: 1)  {    // 多个值绑定语句用逗号分隔,只要有一个值绑定失败,整个结果就是false
             let nn : Int = n0     // 不报错  说明n0是普通类型
             print("n0创建 值为:\(n0)")
         }else{
             print("n0没有创建")
         }
    
    第六章
    1、字符 ---- 使用双引号 (单字符)
     var char01: Character = "a"  // 单字符
     var charStr:Character = "\u{26}" // Unicode编码
    
    2、字符串(结构体) ---- 使用双引号 (单字符或者多字符)
    • 使用String的原因:String是个结构体,性能更高,NSString是一个OC对象,性能略差,String支持直接遍历, Swift提供了String和NSString之间的无缝转换
    var str0: String = "Objective-C and Swift" // String可省略,默认是String类型
    let emptystring1 = "" // 单字符
    

    字符串的长度:

    str0.characters.count  // str0.characters字符串的遍历  Character类型
    
    3、转义符

    “ \t ”: 水平制表符
    " \n ": 换行
    " \r ": 回车
    " "" ": 双引号"
    " ' ": 单引号'
    " \" ": 反斜杠\

    4、字符串的拼接(++=\append相同类型 \()不同类型)
    • 可变字符串: var定义
      不可变字符串:let定义

         append拼接:
         lamda2.append("a") // 必须是单个字符
         lamda2+="123" //  +=写在引号外部
         print(andSign2+"字符串bu相等"+lamda2) //  +写在引号外部
         print("5=\(2+3)") //  将Int类型转String类型拼接,表达式写在引号内部
      
    • *字符串的格式化

       // 字符串的格式化
       var min = 12
       var second = 23
       var time = String.init(format: "%02d: %02d", arguments: [min, second])
      
    5、字符串的插入删除替换 截取

    // 字符串的操作--String.Index是索引类型

    var str0: String = "Objective-C and Swift"
    

    5.1、插入字符 insert(_ newElement: Character, at i: String.Index)

    str0.insert(".", at: str0.endIndex) // "Objective-C and Swift."
    

    5.2、删除字符remove(at i: String.Index)-> Character

    str0.remove(at: str0.index(before: str0.endIndex)) // "."
    

    5.3、删除指定范围removeSubrange(_ bounds: ClosedRange<String.Index>)

    var startIndex = str0.startIndex
    var endIndex = str0.index(startIndex, offsetBy: 9)  // 从startIndex索引开始向后9个字符的索引值
    var range = startIndex...endIndex
    str0.removeSubrange(range)  // "C and Swift"
    

    5.4、替换replaceSubrange(_ bounds: ClosedRange<String.Index>, with newElements: String)

    startIndex = str0.startIndex
    endIndex = str0.index(startIndex, offsetBy: 0)
    range = startIndex...endIndex
    str0.replaceSubrange(range, with: "C++") // "C++ and Swift"
    

    5.5、*字符串的截取

       这种不再使用了,String.Index索引类型不方便
       //str.substring(to: <#T##String.Index#>)
       //str.substring(from: <#T##String.Index#>)
       //str.substring(with: <#T##Range<String.Index>#>)
    
       这样用,先String转NSString,再调用NSString的截取方法,传入Int即可。(str as NSString)是NSString类型
       (str as NSString).substring(to: <#T##Int#>)
    
    6、字符串的比较

    大小: >、 < 是否相等: ==、 !=

    (Swift的Foundation中NSString使用=== 、 !==是否相等)

    ""和String()创建的空字符串是相等的。

     let emptystring1 = ""
    let emptystring2 = String()
    
    if emptystring1 == emptystring2 {
        print("相等")
    }else
    {
       print("不等")
    }
    

    字符串的hasSuffix(_ :) hasPrefix:(_ :)

    lamda2.hasPrefix("1")  // false
    lamda2.hasSuffix("3")  // true

    相关文章

      网友评论

          本文标题:Swift(一 标识符 运算符 数据类型 字符串)

          本文链接:https://www.haomeiwen.com/subject/pfkwhxtx.html