在學習swift的一些筆記(五)

元組(Tuples)


元組數據類型是由多個值組合而成的,可以由相同類型的多個值組成,也可以由不同類型的值組成

  // 元祖類型
  var dog = ("小白",18)

  // 下標調用
  dog.0

利用下標可以取得元祖數據類型的值

as(告知編譯器類型)


// 告知編譯器 這個由dog.0所取出的數據是一個string類型,理解為類型準換也是可以的
(dog.0 as String)

-objective-c與swift函數的區別


** objective-c 的函數 :**

// 傳入一張UIImage類型的參數,和一個UIControlState的枚舉
- (void)setImage:(UIImage *)image forState:(UIControlState)state;   

上面是一個標準的objective-c對象方法,是通過對象調用的其中:
"-" = 對象方法的標示 "+"為類方法.
(void) = 返回值類型.
setImage: = 方法名 : 后面代表著要跟一個參數.
(UIImage *) = 參數類型.
image = 形參的變量名稱.
forState: = 方法名 第二段方法名.
(UIControlState) = 參數類型.
state = 第二個參數變量名.

因為objective-c語言方法的語法,可以在方法名種盡可能的描述詳細整個方法意思和參數的作用,所以在有些時候,方法的注釋很多程序員寫得都不是很完全.

** swift 的函數: **

  • 無參數無返回值的函數:
// 一個無參數,無返回值的函數 調用
demo();

// 一個無參數,無返回值的函數聲明
func demo(){
      println("調用");
}

在swift中,函數的定義符號是func后面的demo就是方法的名稱,如果沒有參數和返回值,定義函數只書寫 func+ 函數名稱(方法名稱)+() + { 代碼段 } 就可以了,調用只需要 方法名+().



// 一個參數,無返回值的函數 調用
 demo("jack");
       

// 一個參數,無返回值的函數 聲明(定義)
 func demo(name : NSString){
       
      println("我叫\(name)");
}

打印出 "我叫jack"

// 兩個參數,無返回值的函數 調用
 demo("jack", age: "18");

// 兩個個參數,無返回值的函數 聲明(定義)
func demo(name : NSString,age : NSString ){
    
        println("我叫\(name)今年\(age)歲");
    }

打印出 "我叫jack今年18歲"

以上的方法中可以看出在swift中可以允許相同的方法名對應不同的參數,而值得注意的是,第二個參數的形參名稱是不允許重復的,即擁有相同方法名,并且都是2個形參,第二個形參的變量名稱不允許相同.

形參的格式 : 形參名稱: 數據類型 (形參中間用,隔開)


  // 調用單個返回值的函數
  var name:NSString = demo1()

  // 單個返回值的函數
  func demo1() ->(NSString){
          return "swift"
      }

單個返回值的函數格式:func 函數名( 形參 ) ->(返回值類型)


  // 調用函數,得到一個元祖類型的返回值
  let te =  demo1("我")
  // 將元祖類型的返回值一一取出拼接
  let text = (te.0 as String) + (te.1 as String)  + (te.2 as String);
  // 打印
  print(text);
 
  // 打印結果為: 我測出了BUG  

  // 單參數 多返回值的函數
  func demo1(name:NSString)->(NSString,NSString,NSString){
    
        return (name,"測出了","BUG");
    }

swift新加入了多個返回值的函數,這個樣的函數返回的是一個元祖類型
格式: func 函數名(形參列表) ->(返回值,...)


數組當做形參的2種形式:
1種:

  // 調用函數傳入數組
   arrDemo([3,6]);
  
  //  直接傳入一個數組變量
   func arrDemo(arr:NSArray){
        // 遍歷數組元素
        for indext in arr{
            // 打印得到3,6
            print(indext);
        }
   }

2種:

  // 調用函數
    arr1Demo(11.3,222.341,11112.3);
  // 傳入參數用,隔開
    func arr1Demo(num:CGFloat...){
        // 遍歷數組元素 并打印
        for indext in num{
            print(indext);
        }
  }

1種格式: 形參變量:NSArray
2種格式: 形參變量: 數據類型...


閉包:

override func viewDidLoad() {
        super.viewDidLoad()
        
        func nog(){
        
            print("打印日志")
        }
        
        nog()
        
    }

閉包簡單就是說在一個函數中能夠定義一個函數,在外部函數中可以調用里面的函數,并且里面的函數可以訪問外部函數的變量.

    // 首先定義一個接收一個int參數 一個string返回值的函數,這是一個內部函數
    func test(num:Int) -> (String) {
            
        return "\(num)號測試";
            
    }
    
    // 在定義一個外部函數,這個函數接收一個函數變量, 這個函數擁有一個int的形參和  string的返回值
    func demo( test: Int -> (String) )->NSString{
       
       // 在外部函數中調用當做形參的內部函數
       return test(2);
    }
  
    // 將這個外部番薯調用, 并用一個字符串接收返回值
    let testStr =  demo(test)

    // 打印 得到結果是: 2號測試
    print(testStr);

函數作為形參 ( 函數變量名 : 形參列表 -> (返回值類型) )

    // 定義一個外部函數 這個函數的返回值是一個閉包函數,傳入一個string形參,返回值是string的函數
    func demo3()->(String -> String){
        // 內部函數,形參string ,返回值string
        func text(name:String)->String{
        
            return name;
        }
        // 返回的是閉包函數
        return text;
    }
    // 調用閉包函數,得到 一個函數 形參是string 返回值是string
    let text = demo3();
    // 調用這個函數
    let n :String = text("小白");
    // 打印最后得到的值 輸出是小白
    print(n)

函數作為返回值 ->(形參->返回值)


匿名閉包函數

    // 首先先寫一個匿名閉包函數,這個函數接收3個字符串參數并且拼接后返回
    // 但是我們沒有方法名所以訪問不了這個函數
    {(name:String,name2:String,name3:String) -> String in
            return name + name2 + name3
    }
   // 在寫一個接收的函數,這個函數可以接收上面的那種匿名函數的類型,并且返回一個字符串
   func demo4(test:(String,name2:String,name3:String)->String  )->String{
    
   } 
  // 在這個函數中調用匿名函數,所返回的是中國人3個字,
  func demo4(test:(String,name2:String,name3:String)->String  )->String{
      return test("中",name2: "國",name3: "人");
  } 
  // 那么我們要執行 demo4這個函數 并且將匿名函數傳進去,所得到的返回值是"中國人"
  let name =   self.demo4({(name:String,name2:String,name3:String) -> String in
      return name + name2 + name3
  })
  // 打印
  print(name)        
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,541評論 1 51
  • 我常常在想風是怎么來的,風為什么叫風,風的形態是什么樣子的,想了很多關于風的問題,自己便也變成了風。
    風中的一粒沙子閱讀 211評論 0 0