天天看點

swift 2.2 文法 (上)

前言:

1.此文中的文法會根據Swift的更新變動而更新。

2.如果需要請移步 -> swift2.2 文法(中)、swift 2.2文法(下)

Swift與OC中常見的差別

  • 導入架構
    • OC:
      #import <UIKit>
       #import "AFNetWorking.h"
                 
    • Swift:
      import UIKit
                 
  • 定義辨別符
    • OC:
      int i = 0;
      
                 
    • Swift:
      // 不可變辨別符
       let i =   或 let i : Int = 
      
       // 可變辨別符
       var i =   或 var i : Int = 
                 
  • “;”号的使用
    • OC:每個語句後都必須加上;以示結尾
    • Swift:

      1.如果在一行中隻有一條語句,那麼語句結束時 “;” 号可以省略

      2.如果一行中有多條,那麼需要以 “;” 進行分割

常量和變量

  • 在定義一個辨別符時,必須明确告訴編譯器這個辨別符是變量還是常量
  • 常量,需要在定義最前面加上 ‘let’,定義後不可修改
  • 變量,需要在定義最前面加上 ‘var’,定義後可以修改
    • 格式:let/var 辨別符名稱 : 類型 = 10;
import UIKit

 // 定義一個常量
 let a : Int =     //  或 let a = 0
 // 因為常量不可修改,是以 a = 1 的是錯誤的寫法

 // 定義一個變量
 var b : Int =     //  或 var b = 0
 // 因為變量可以修改,是以來修改下變量
 b = 

           
  • 常量使用注意
    • 在開發中優先使用常量,隻有發現該辨別符需要修改時,再改成變量(保證資料更加安全)
    • 常量本質:指向的記憶體位址不可修改,但通過記憶體位址找到對應的對象,就可以修改對象内部屬性
    //  建立一個常量指向UIView并修改内部屬性
    let view : UIView = UIView()
    //  設定尺寸
    view.frame = CGRectMake(, , , )
    //  設定背景顔色
     = UIColor.greenColor()
    
    //  定義一個常量儲存尺寸資訊
    let rect = CGRectMake(, , , )
    //  定義一個變量指向UIView并切換到UIButton
    var tempView : UIView = UIView(frame: rect)
    //  設定背景顔色
    tempView.backgroundColor = UIColor.redColor()
    //  切換變量指向的View
    tempView = UIButton(type: .Custom)
               

swift中資料類型

  • 介紹
    • Swift中的資料類型也有:整型/浮點型/對象類型/結構體類型等
      • 整型
        • 有符号
          • Int8 : 有符号8位整型
          • Int16 : 有符号16位整型
          • Int32 : 有符号32位整型
          • Int64 : 有符号64位整型
          • Int : 和平台相關(預設,相當于OC的NSInteger)
        • 無符号
          • UInt8 : 無符号8位整型
          • UInt16 : 無符号16位整型
          • UInt32 : 無符号32位整型
          • UInt64 : 無符号64位整型
          • UInt : 和平台相關(常用,相當于OC的NSUInteger)(預設)
        • 浮點型
          • Float : 32位浮點型
          • Double : 64浮點型(預設)

類型推導

  • Swift是強類型語言
  • Swift中任何一個辨別符都有明确的類型
  • 注意:
    • Swift中在定義一個辨別符時,有直接給該辨別符進行指派,那麼辨別符後面的類型可以省略(因為類型推導會自動根據後面指派的類型推導出前面辨別符的類型)
    • 在Swift中可以通過option + 滑鼠左鍵,可以檢視某個辨別符的類型
//  定義一個Int類型的常量
let a : Int = 
//  因為有類型推導的特性,是以上面的語句可以簡寫為
let a =   //  編譯器會自動根據右邊值得類型判定資料類型

//  定義一個浮點類型的常量
let b : Double = 
//  因為有類型推導的特性,是以上面的語句可以簡寫為
let b =     //  因為右邊是浮點型資料,是以編譯器會判定常量類型為浮點型
           

基本運算

  • 在Swift中,不同類型的資料類型之間不能進行運算(因為Swift中沒有隐式轉換)
  • 如果資料類型不一緻,就需要轉化資料類型,使類型一緻
//  相同類型運算
let a = 
let b = 
//  求和
let sum = a + b


//  不同類型運算
let a = 
let b = 
//  轉換類型
let tempA = Int(a)
//  求和
let sum = tempA + b
           

判斷分支

  • 介紹
    • 判斷分支指if/switch/三目運算符等判斷語句
    • 通過判斷分支可以控制程式的執行順序
  • if判斷
    • if後面的()可以省略掉
    • 在Swift中,判斷語句必須有明确的真假
      • if後面的判斷句沒有非0(nil)即真概念
      • if後面的判斷句必須明确真假(Bool) –> true/false
      let a = 
      
      if a > {
          print(a)
      }
      
      //  因為Swift中,隻有聲明成可選類型,才能判斷是否為空
      let view : UIView? = UIView()
      
      if view != nil {
      
      view!.backgroundColor = UIColor.blueColor()
      
      }
                 
  • 三目運算符(和OC一樣,沒有别的差別)
let a = 
let b = 

var result = a > b ? a : b

print(result)
           
  • guard(守衛)使用
    • guard是Swift2.0新增的文法
    • 它與if語句非常類似,設計的目的是提高程式的可讀性
    • guard語句必須跟上else,{}内必須跟上break/continue/return
/* 假設成績為100分,60以下為不及格 */

//  定義一個常量
let a = 

//  定義一個test函數,參數Int類型
func test(a : Int) {

    guard a >=  else {

        print("不及格")
        return
    }

    print("優秀")
}

//  調用函數
test(a)
           
  • switch判斷
    • 介紹
      • 蘋果對Switch進行了大大的增強,使其擁有其他語言沒有的特性
    • 使用
      • 基本用法和OC一樣
      • switch後面的()可以省略
      • case後的break可以省略(預設會自動填補break)
    let a = 
    
    switch a {
    case  :
        print("真")
    case  :
        print("假")
    default :
        print("其它")
    }
               
    • 一個case判斷中,可以判斷多個值(值之間用 “,” 分隔)
    let a = 
    
    switch a {
    case ,  :
        print("真假")
    default :
        print("其它")
    }
               
    • 如果希望出現case穿透,可以使用關鍵字fallthrough
    let a = 
    
    switch a {
    case  :
        fallthrough
    case  :
        print("假")
    default :
        print("其它")
    }
               
    • switch支援多種資料類型(包含浮點型、字元串類型)
    • switch支援區間判斷
      • 常見的區間

        1.半開半閉區間:0..<10(表示0~9)

        2.閉區間:0…10(表示0~10)

      /* 假設成績為100分 */
      
      let a = 
      
      switch a {
      
      case .<:
       print("不及格")
      case .<:
       print("幾個")
      case .<:
       print("良好")
      case .<:
       print("優秀")
      default:
       print("滿分")
      
      }
                 

循環

  • 循環是開發中必不可少的,常見循環有:for/while/do…while
    • for循環
      • for後面的()可以省略
    //  傳統寫法
    for var i = ; i < ; i++ {
        print(i)
    }
    
    //  區間循環
    for i in .< {
        print(i)
    }
    
    for i in . {
        print(i)
    }
    
    //  特殊寫法
    //  有時候我們隻需要循環語句内的操作,不需要i,那麼i可以用_代替
    for _ in .< {
        print("hello world")
    }
               
    • while循環
      • while的判斷句必須有真假(沒有非0即真概念)
      • while後面的()可以省略
    var a = 
    
    while a <  {
        a++
    }
               
    • do…while循環
      • 使用repeat關鍵字代替了do
    let a = 
    repeat {
        print(a)
        a++
    } while a < 
               

字元串

  • OC和swift中字元串的差別
    • OC中字元串類型為NSString,在swift中字元串類型為String
    • OC中字元串用@“”包裝,swift中字元串用“”包裝
  • 使用String原因
    • String是一個結構體,性能較高;NSString是一個OC對象,性能較差
    • String支援直接周遊
    • swift提供了String和NSString間無縫轉換
  • 定義
    • 不可變字元串
    • 可變字元串
  • 使用
    • 擷取字元串長度
    • 周遊字元串
    var str = "hello world"
    
    for tmp in str.characters {
    
    }
               
    • 字元串拼接
    let str1 = "hello"
    let str2 = "world"
    let str = str1 + str2
               
    • 字元串和其它資料類型拼接
    let str1 = "xiao ming"
    let str2 = 
    
    let str = "\(str1)今年\(str2)歲"
               
    • 字元串的格式化
      • 如:時間
      let min = 
      
      let time = String(format:"%02d", arguments:[min])
      
                 
    • 字元串截取方式
      • 常用方式:String轉換成NSString後再截取(簡便)
      let myStr = "hello world"
      var subStr = (myStr as NSString).substringFromIndex()
      subStr = (myStr as NSString).substringToIndex()
      subStr = (myStr as NSString).substringWithRange(NSRange(location: , length: ))
                 
      • 方式二:使用swift原生截取方式
      //  定義一個String類型的常量str
      let str : String = "http://blog.csdn.net/yeshaojian"
      
      //  截取開始位置
      let startIndex = str.startIndex.advancedBy()
      let head = str.substringFromIndex(startIndex)
      
      //  截取結束位置
      let endIndex = str.endIndex.advancedBy(-)
      let foot = str.substringToIndex(endIndex)
      
      //  截取中間網址
      let range = Range(start: startIndex, end: endIndex)
      let middle = str.substringWithRange(range)
                 

數組

  • 介紹
    • 數組(Array)是一串

      有序的由相同類型元素

      構成的集合
    • 數組中的集合元素是

      有序

      的,可以

      重複

      出現
    • swift中的數組
      • swift數組是一個

        泛型集合

        ,

        類型

        是Array,
  • 初始化數組
    • 數組分為可變數組和不可變數組
      • 使用

        let

        修飾的數組是不可變數組
      • 使用

        var

        修飾的數組是可變數組
      //  在swift中任意類型一般不用NSObject而會使用AnyObject
      //  定義一個不可變數組(存儲内容為AnyObject)
      let array : [AnyObject] = ["123", , ["se"]]
      
      //  定義一個可變數組,并初始化值
      var arrayM : [String] = [String]()
                 

      注意:在swift中任意類型一般不用NSObject而會使用AnyObject

    • 聲明數組的簡便寫法
    //  聲明可變數組
    var arrayM2 : Array<String>
    //  或
    var arrayM3 : [String]
    
    //  聲明不可變數組
    let array1 : Array<AnyObject>
    let array2 : [AnyObject]
               

    注意:聲明的數組需要初始化才能使用,數組類型一般都是在聲明的同時進行初始化

    • 對聲明的數組進行初始化
    //  初始化值
    arrayM2 = ["1", "2", "3"]
    //  初識化後可追加值
    arrayM2.append("隔壁老王")
    
    //  因為上面我們聲明的array1是let(常量),是以初始化後不能追加元素(不能使用append追加元素)
    array1 = ["se",]
               
    • 數組的增、删、改、查
    //  定義一個可變數組
    var arrayM : [AnyObject] = ["123",,,]
    
    //  添加資料
    arrayM.append("隔壁老王")
    
    //  取值
    arrayM]
    
    //  修改元素
    arrayM] = "12"
    
    //  删除數組最前面的元素(這邊填 2 就表示删除2次,是以執行完畢後 隔壁老李 和 "123" 會被删除)
    arrayM.removeFirst)
    
    //  删除數組最後面的元素
    arrayM.removeLast()
    
    //  删除指定下标的元素(0 表示删除第一個元素)
    arrayM.removeAtIndex)
    
    //  删除所有元素
    arrayM.removeAll()
               
    • 數組的周遊
    //  定義一個可變數組
    var arrayM : [AnyObject] = ["123", , , , "隔壁老王"]
    
    //  方式一:周遊數組下标
    for i in .<arrayM.count {
        print(i)
    }
    
    //  方式二:周遊數組内容
    for name in arrayM {
        print(name)
    }
    
    //  方式三:設定數組周遊區間
    for name in arrayM[.<] {
        print(name)
    }
    
    //  方式四(常用)周遊數組同時擷取下标
    for (i, name) in arrayM.enumerate() {
        print("\(i)--\(name)")
    }
               
    • 數組合并
    // 相同類型的數組才能合并
    let array1 = ["123", "157", "12345", "234567", "15689123"]
    let array2 = ["1568648", "26879435", "1578715645"]
    
    let array3 = array1 + array2
    
    //  一個數組最好不要存放多種類型資料
    var arrayM1 = ["mms", , "隔壁老王", , "15689123"]
    var arrayM2 = [, "哈哈哈哈", "1578715645"]
    
    var arrayM3 = arrayM1 + arrayM2
               

    注意:隻有相同類型的數組才能合并

字典

  • 介紹
    • 字典由鍵(key)集合和值(value)集合兩部分構成
    • 鍵集合不能有重複元素,而值集合可以重複,每一個鍵對應一個值
    • 字典可以按照某個鍵來通路對應的元素
    • swift字典類型為

      Dictionary

      ,和數組一樣死個`泛型集合“
  • 初始化字典
    • swift的字典分為可變和不可變字典2種
      • 使用

        let

        修飾的字典是不可變字典
      • 使用

        var

        修飾的字典是可變字典
      //  定義一個不可變字典
      let dict = ["name" : "laoWang", "city" : "隔壁", "age" : ]
      
      //  定義一個
      var dictM : [String : AnyObject] = [String : AnyObject]()
                 

      注意:在swift中任意類型一般不用NSObject而會使用AnyObject

    • 聲明字典
    //  聲明不可變字典
    let dict1 : [Int : AnyObject]
    let dict2 : Dictionary<Int, AnyObject>
    
    //  聲明可變字典
    var dictM1 : [Int : AnyObject]
    var dictM2 : Dictionary<Int, AnyObject>
               
    注意:和數組一樣,聲明的字典也需要初始化值後才可使用
    • 聲明的字典需要初始化才能使用,字典類型一般是在聲明的同時進行初始化
    //  初始化不可變字典值
    dict1 = [ : "aa",  : "bb",  : "cc"]
    dict2 = ["name" : "laoWang", "age" : ]
    
    //  初始化可變字典值
    dictM1 = ["name" : "laoWang", "age" : ]
    dictM2 = [ : "aa",  : "bb",  : "cc"]
               
    • 字典的增删改查
    //  添加Key為city value為gebi
    dictM1["city"] = "gebi"
    
    //  修改
    dictM1["name"] = "laoLi"
    
    //  查詢
    dictM1["name"]
    
    //  删除
    dictM1.removeValueForKey("city")
    
    //  删除所有元素
    dictM1.removeAll()
               
    • 字典周遊
    //  方式一:周遊字典内所有值
    for value in dictM1.values {
        print(value)
    }
    
    //  方式二:周遊字典中所有的鍵
    for key in dictM1.keys {
        print(key)
    }
    
    //  方式三:周遊字典中鍵和值
    for (key, value) in dictM1 {
        print("\(key) : \(value)")
    }
               
    • 字典合并
    //  字典合并
    //  隻有字典内容類型相同的字典才可合并
    //  定義一個不可變字典(key:String類型 value:AnyObject類型)
    let dict1 : [String : AnyObject] = ["name" : "laoWang", "age" : ]
    //  定義一個可變字典(key:String類型 value:AnyObject類型)
    var dictM2 : Dictionary<String, AnyObject> = ["city" : "gebi"]
    
    //  周遊dict1的key和value并合并(添加)到dictM2字典中
    for (key, value) in dict1 {
        dictM2[key] = value 
    }
    
    print(dictM2)
               
    注意:隻有字典内容類型相同的字典才可合并

元組

  • 元組是Swift中特有的,OC中并沒有相關類型
    • 元組是一種資料結構,類似于數組或者字典
    • 可以用于定義一組資料
    • 多個值組合而成的複合值。元組中的值可以是任意類型,而且每一個元素的類型可以不同
    • 組成元組類型的資料稱為“元素”
  • 定義元組
    //  方法一:基本寫法(格式:(元素,元素)  資料類型不限)
    let personInfo1 = ("老王", , , "laoWang")
    
    //  方法二:在上面方法的基礎給元素定義名稱
    let personInfo2 = (name:"老王", age:, height:, EnglishName:"laoWang")
    
    //  方法三:先定義元素名,在設定值
    let (name, age, height, EnglishName) = ("老王", , , "laoWang")
    
    //  方法四:明确有幾個元素并且确定類型
    var personInfo3 : (Int, String) = (, "老王")
               
  • 元組操作
    //  通過下标或者别名讀取值
    personInfo1
    
    personInfo2.name
    
    name
               

可選類型

  • 可選類型作用:
    • 在OC中,如果一個變量暫停不适用,可以指派為0(基本屬性類型)或指派為空(對象類型)
    • 在swift中,nil被定義為一個特殊的類型,因為和真是的類型不比對是不能指派的(強類型語言特性)
    • 為了在開發中指派為nil,畢竟很經常用到,是以推出了可選類型
    • 可選類型的取值為:
      • 空值
      • 有值
  • 可選類型定義
    • 基本寫法(不常用)
    //  基本寫法
    let user : Optional<String> = nil
               
    • 糖文法(推薦)
    //  糖文法
    let user : String? = nil
               
  • 可選類型簡單使用
//  可選類型使用
var user : String? = nil

//  給可選類型指派(我們上面定義的可選類型為String類型,是以隻能給他指派String類型)
user = "laoWang"

//  可選類型取值(在可選類型内,隻能通過強制解包來取出可選類型的真實類型)
//  強制解包方式一:
user!

//  需要注意的是,如果可選類型為nil(為空),強制取出其中的值(強制解包),會出錯
//  強制解包方式二:
if user != nil {
    print (user!)
}

//  為了在if語句裡面友善使用user,我們可以定義一個可選綁定類型,這樣也能達到嚴謹取值的效果(底層也是幫我們進行判斷,有值就會解包)
if let userStr = user {
    print (userStr)
}
           

注意:

1.如果可選類型為nil(為空),強制取出其中的值(強制解包),會出錯,是以解包前需要進行判斷

2.為了使用友善,解包會以

可選綁定

的形式實作

  • 可選類型重要性(讓代碼邏輯更加嚴謹)
//  OC中,我們在定義一個包含中文的NSURL的時候是這樣的
NSString *urlStr = @"http://www.xxxxx.com/中文/sie";

//  因為字元串中包含中文,是以需要對字元串進行UTF8編碼轉換,防止出現通路錯誤
NSString *str = [urlStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

//  再将其包裝成NSURL
NSURL *url = [NSURL URLWithString:str];


//  在swift中,如果字元串中包含中文,且我們沒有對其進行處理,那麼就會直接傳回nil
//  也就是說,url可能有值也可能沒值,這時候就需要用可選類型來接收
//  方法一:标準寫法
let url : NSURL? = NSURL(string: "http://www.xxxxx.com/中文/sie")
//  方法二:利用類型推導
let url2 = NSURL(string: "http://www.xxxxx.com/中文/sie")
//  方法三:可選綁定
if let temp = url {
    let request = NSURLRequest(URL: temp)
    print (request)
}

           

類型轉化

  • 類型轉化符号
    • as:将示例轉成某一類型
      • as?:判斷是否有值,有則轉換,沒有則不轉換(推薦)
      • as!:不判斷是否有值,直接轉換(不安全)
    • is:用來判斷一個示例是否是某一種類型
    //  定義一個數組
    let array : [AnyObject] = ["laoWang", , ]
    
    //  取出數組中的第二個元素
    let temp = array[]
    
    //  判斷第一個元素類型是否為字元串
    if temp is String {
        print("true")
    } else {
        print("flase")
    }
    
    //  将objc轉成真實類型
    //  方式一:使用as?将AnyObject轉成可選類型,通過判斷可選類型是否有值,來決定是否轉換成功
    let age = temp as? Int
    print(age)
    
    //  方式二:使用as!将AnyObject轉成真實類型,因為objc的真實類型為Int不是String,通過as!進行轉換後,會直接報錯
    let age1 = temp as! String
    print(age1)