元组(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)