在学习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阅读 8,304评论 1 52
  • 我常常在想风是怎么来的,风为什么叫风,风的形态是什么样子的,想了很多关于风的问题,自己便也变成了风。
    风中的一粒沙子阅读 95评论 0 0