rn (num1,num2)
}
// 调用函数(交换的只是函数内部参数的值,而a,b的值并没变)
test(a, num2: b) // 结果 9 6
print(a, b) // 结果 6 9
// 通过上面的方式可以明显看出值传递并不能真实转换外部变量的值,在swift中我们可以通 过"inout"关键字来讲外部变量的值传给函数参数,再改变其值
func test(inout num1 : Int, inout num2 : Int) -> (num1 : Int, num2 : Int) {
let temp = num1
num1 = num2
num2 = temp
return (num1, num2)
}
// 调用函数(因为传入的是a,b的变量地址,等于拿到了外部变量,函数内部操作的num1,num2可以看成a,b,因为他们的指针指向了a,b)
test(&a, num2: &b)
print(a,b)
函数嵌套使用
- swift中函数可以嵌套使用
- 虽然可以嵌套使用,但是这种做法降低了可读性,所以尽量不要这样做
// 函数嵌套
let a = 100
let b = 35
func test() {
func sum(num1 : Int, num2 : Int) {
print("和为\(num1 + num2)")
}
print("test函数")
sum(a, num2: b)
}
// 调用函数
test() // 先调用test函数,再调用sum函数
注意:无法调用sum函数,因为它是test函数的一部分
函数类型
- 每个函数都有属于自己的类型,由函数的参数类型和返回值类型组成
// 函数类型:定义2个函数,且都为 (String, String) -> (String) 类型
func test1(name : String, city : String) -> String {
return name + city
}
func test2(tiele : String, iconUrl : String) -> String {
return "图片名称:\(tiele)图片地址为:\(iconUrl)"
}
将函数作当成变量传递
// 根据函数类型定义变量并将函数传递给变量
var tempFunction : (String, String) -> String = test1
// 使用变量名调用函数
tempFunction("sd", "lw")
// 将函数当成参数使用
func test3(str1 : String, str2 : String, tempFunction : (String, String) -> String) {
print(tempFunction(str1, str2))
}
// 调用函数
test3("aa", str2: "bb", tempFunction: test1) // 结果 aabb
// 函数作为方法返回值
/**
* 判断一数是否为负数,是负数返回0,不是则返回原来的值
*/
// 正数调用此函数
func positive(num : Int) -> Int {
return num
}
// 负数调用此函数
func negative(num : Int) -> Int {
return 0
}
// 将函数作为返回值
func test(num : Int) -> (Int) -> Int {
// 如果函数小于1就是负数,返回negative函数,如果大于1,则是正数,返回positive函数
return num < 0 ? negative : positive
}
// 获取返回值(函数)
let function = test(-1) // 因为是负数,所以返回negative函数
// 调用方法(再将-1传入返回的函数)
function(-1) // 结果为 0
枚举类型
- 枚举用来定义一组通用类型的相关值,可以让达到让使用者按照设计者的规范使用特定的值
- swift的枚举非常灵活,可以给枚举成员提供一个字符串,一个字符,一个整型或浮点值,不必给每个枚举成员提供值
C语言和OC里面枚举指定的一组相关成员为整型
- 枚举类型定义
- 使用
enum
关键词,将定义放在{}内
- 使用
case
关键词定义新枚举成员
- 需要注意的是,swift的枚举在被创建的时候不会像C和OC那样赋予默认整型值
// 枚举定义
enum testType {
case testTypeOne
case testTypeTwo
case testTypeThree
}
// 当然也可以简写成下面的方式(在枚举成员特别多的情况下很好用)
enum testType {
case testTypeOne, testTypeTwo, testTypeThree
}
枚举类型赋值
- 枚举类型赋值可以是整型、浮点型、字符、字符串
- 如果有给枚举类型赋值,必须在枚举类型后面明确类型使用的类型
// 枚举类型赋值
enum testType1 : Int {
case One = 1
case Two = 2
case Three = 3
}
// 或
enum testType2 : Int{
case One = 1, Two, Three
}
枚举类型使用
// 枚举类型赋值(整型)
enum testType1 : Int {
case One = 1
case Two
case Three
}
// 枚举类型赋值(字符串)
enum testType2 : String{
case One = "a", Two = "b", Three
}
let j = testType1(rawValue: 2) // 获取到枚举成员Two
// 结果为Two
if let j = j {
switch j {
case .One:
print("One")
case .Two:
print("Two")
case .Three:
print("Three")
}
}
let i = testType2(rawValue: "a") // 获取到枚举成员One
// 结果为One
if let i = i {
switch i {
case .One:
print("One")
case .Two:
print("Two")
case .Three:
print("Three")
}
}
注意:
1.如果明确了类型为整型且未设置初始值,那么由0开始依次递增(默认)
2.如果明确了类型为整型但设置了初始值,就由初始值依次递增
结构体(struct)
- 结构体是一种数据结构
- 结构体在方法(函数)中传递时时值传递,是值类型
- 结构体是由一组相同类型或不同类型的数据组成的数据集合
在特定情况下使用结构体,能使我们的代码结构更清晰
定义结构体格式
struct 结构体名称 {
属性
}
/**
* 在手势开发过程中,我们需要监听手指移动的位置,这边我们来判断手指移动的开始位置和结束位置距离是否大于50
*/
// 初始化