文章摘要
GPT 4
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//掷骰子
func rollDice() -> Int {
return Int.random(in: 1...6)
}
let result = rollDice()
print(result)

//直角三角形求斜边
func pythagoras(a : Double,b : Double) -> Double {
let input = a * a + b * b;
return sqrt(input)
}
print(pythagoras(a: 3, b: 4))
//可简写成
func pythagoras(a : Double,b : Double) -> Double {
sqrt(a * a + b * b)
}

//元组
func getUserName() -> (firstName:String, lastName:String){
(firstName:"Su",lastName:"Yikun")
}
let firstName = getUserName().firstName
let lastName = getUserName().lastName
print("Name:\(firstName) \(lastName)")

let (firstName2, lastName2) = getUserName()
print("Name2:\(firstName2) \(lastName2)")

除了返回类型在函数名后面,其他跟Java差不多,也有重载的概念。
但两个知识点:
一是如果有返回值时 return 可以省略掉。
二是 let (firstName2, lastName2) = getUserName() 这种形式第一次见还是前端代码里,但没有仔细的学过,应该是叫元组 tuple,后续需要多用加深下记忆。

外部参数

1
2
3
4
5
6
7
8
9
10
11
func isUppercase(string : String){
string == string.uppercased()
}
let str1 = "HELLO"
print(isUppercase(string: str1))

func isLowercase(_ string : String){
string == string.lowercased()
}
let str2 = "hello"
print(isLowercase(str2))

通过上述两个函数的对比,在给参数前加上下划线的话,外部参数名称可以省略。

1
2
3
4
5
6
7
8
9
func sayWords(word : String) -> String {
"Hello,\(word)"
}
print(sayWords(word: "swift"))

func sayWords2(to word : String) -> String {
"Hello,\(word)"
}
print(sayWords2(to: "swift"))

在参数可以添加一个名称,这样外部参数名称可以使用它。

默认值

1
2
3
4
5
6
7
8
9
func addOne(num : Int = 1) -> Int{
num+1
}
print(addOne())

var characters = ["a","b","c"]
characters.removeAll(keepingCapacity: true)
//源码
func removeAll(keepingCapacity keepCapacity: Bool = false)

类型后面加 =xx 可以给参数默认值,典型的像removeAll,它有入参keepingCapacity,默认为 false

异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import UIKit

enum PasswordError: Error{
case short, obvious
}

func checkPassword(_ password:String) throws -> String{
if password.count < 5 {throw PasswordError.short}
if password == "12345" {throw PasswordError.obvious}

if(password.count < 8){
return "Ok"
}else if(password.count < 8){
return "Good"
}else{
return "Perfect"
}
}

let str = "12345"
do{
let result = try checkPassword(str)
print(result)
}catch PasswordError.short{
print("This password is too short")
}catch PasswordError.obvious{
print("This password is too obvious")
}catch{
print("There was an error")
}

需要抛异常加 throws 关键字,而且方法前要加 try,还要用 do catch 框起来,如果你确信不会抛异常,那么可以 try! checkPassword(str) ,但如果你判断失误,那么就会崩溃。

总结

  • 函数通过分割代码块并为其命名来重用代码。
  • 函数以单词 func 开头,后跟函数名称。
  • 函数可以接受参数来控制其行为。
  • 您可以添加自定义外部参数名称,或使用 _ 跳过。
  • 一个函数参数可以具有常见场景的默认值。
  • 函数可以选择返回一个值,但您可以使用元组从函数返回多个数据。
  • 函数可以使用 do、try 和 catch 抛出错误。

课后作业

编写一个函数,接受从 1 到 10,000 的整数,并返回该数字的整数平方根。

  1. 您不能使用内置 sqrt() 函数或类似函数 - 您需要自己找到 平方根。
  2. 如果数字小于 1 或大于 10,000,您应该抛出“超出范围”错误。
  3. 您应该只考虑整数平方根。
  4. 如果找不到平方根,则抛出“无根”错误。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum SqrtError:Error{
case isNotExisted, outOfRange
}

func calSqrt(_ num : Int) throws -> Int{

if num < 1 || num > 10_000 {throw SqrtError.outOfRange}

for i in 1...100{
if num == i * i {return i}
}

throw SqrtError.isNotExisted
}

do{
let result = try calSqrt(169)
print(result)
}catch SqrtError.outOfRange{
print("超出范围了")
}catch SqrtError.isNotExisted{
print("无根")
}