此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结
函数 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().firstNamelet lastName = getUserName().lastNameprint ("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 UIKitenum 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 的整数,并返回该数字的整数平方根。
您不能使用内置 sqrt() 函数或类似函数 - 您需要自己找到 平方根。
如果数字小于 1 或大于 10,000,您应该抛出“超出范围”错误。
您应该只考虑整数平方根。
如果找不到平方根,则抛出“无根”错误。
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 ("无根" ) }