Swift - 函数

函数是一段完成特定任务的独立代码片段。

函数的组成

  • 函数名:每个函数有个函数名,用来描述函数执行的任务。
func setupSubViews() {
}
  • 参数:定义函数时,可以定义一个或多个限制了类型的参数,作为请求参数,多个请求参数以逗号分隔。
func getMessageByType(pageNum: Int, pageSize: Int) {
}
  • 返回参数:定义函数时,可以定义一个返回值类型,用于返回函数处理结果。
func getNameContent() -> String { 
}
  • 类方法标志classstatic
class func logFunc1() {
}

static func logFunc2() {
}

函数的变形

按照苹果的风格,调用函数时,更像是一句话。

  • 相对于OC,Swift中做了内部参数和外部参数的区分。应用好了,外部调用的时候读着像一句话,意思明确,函数内部调用时参数意思明确。
    比如为String起一个分类,定义一个截取字符串的方法,在函数内部使用location,但是在调用时,函数表现的是at
code.substring(at: idx, length: 1)
extension String {
    /// 截取特定范围的字符串 索引从 0 开始
    /// - Parameters:
    ///   - location: 开始的索引位置
    ///   - length: 截取长度
    /// - Returns: 字符串
    public func substring(at location: Int, length: Int) -> String {
        if location > self.count || (location+length > self.count) {
            assert(location < self.count && location+length <= self.count, "越界, 检查设置的范围")
        }
        var subStr: String = ""
        for idx in location..<(location+length) {
            subStr += self[self.index(self.startIndex, offsetBy: idx)].description
        }
        return subStr
    }
}
  • 隐藏外部参数名
    在外部如果不需要显示参数名,可以用 _ 代替外部参数名。在调用的时候则不会显示参数名,但是内部调用的时候不受影响
getFileName(url.absoluteString)
func getFileName(_ text: String) -> String {
  let startRange: Range = text.range(of: "tmp/")!
  let startLocation: Int = text.distance(from: text.startIndex, to: startRange.upperBound)
  let subStr = text.suffix(text.count - startLocation)
  return String(subStr)
}

函数的类型

无参数无返回值。用的最多的,一般处于任务的末端,单一功能的封装。

调用即执行,目的更多是对功能的封装,提高代码可读性。

func setupSubViews() {
  view.backgroundColor = .white
}
无参数有返回值。用的不多,一般都是从已知内容中获取所需内容

比如获取当前页面输入框所输入的内容。(输入框已存在,函数获取到内容,做一番处理返回就行了)

func getInputContent() -> String? {
  if verificationMode == .mobile {
    return (codeLabel.text ?? "") + "-" + (mobileTextField.text ?? "")
  }
  return mobileTextField.text
}
有参数无返回值。用处挺多,一般是基于传入的参数,执行一系列任务。

比如调用一个有分页的接口,我需要传入一个当前的页码,函数基于页码去调用接口。

func getMessageByType(pageNum: Int, pageSize: Int) {
}
有参数有返回值。和有参数无返回值差不多,差别就在是否需要返回值。一般多用于对参数的处理,返回处理后的参数

比如对字符串进行处理

func replaceSpecialCharacters(in text: String, with replacement: String) -> String {
  do {
    let regex = try NSRegularExpression(pattern: "[^a-zA-Z0-9\u{4e00}-\u{9fa5}]", options: [])
    let range = NSRange(location: 0, length: text.utf16.count)
    return regex.stringByReplacingMatches(in: text, options: [], range: range, withTemplate: replacement)
  } catch {
    return StringSingle.res_txt_default.string
  }
}

特殊的函数

抛出错误、异常

如果一个函数可能会抛出错误,调用这个函数时需要使用try关键字,并且需要处理错误(使用do-catch语句)。

  • 函数定义:
func requestData(url: String) throws -> String? {
  var code = Int.random(in: 0...3)
  switch code {
  case 0:
    let domain = "baidu"
    let userInfo = [NSLocalizedDescriptionKey: "error message"]
    let tempError = NSError(domain: domain, code: code, userInfo: userInfo)
    throw tempError
  case 1:
    return "Ok"
  case 2:
    return nil
  default:
    return nil
  }
}
  • 函数调用:
let network = Network()
do {
  let resStr = try network.requestData(url: "sssss")
} catch let error{
  print(error.localizedDescription)
}

异步函数

Swift中执行耗时任务,为了不阻塞当前线程,需要开辟子线程执行任务。封装出来的函数,就是异步函数。定义一个异步函数时用到的关键字:

  1. async:异步函数标志,表示此函数不会阻塞主线程。
  • 函数定义:
func refreshToken(tokenType:TokenType, refreshToken: String) async -> Bool{
}
  • 函数调用:
let isSuccess = await refreshToken(tokenType: tokenType, refreshToken: refresToken1)
  1. async throws:
  • 函数定义:
func fetchingTokenCustom(customBaseURL: String) async throws -> Data {
}
  • 函数调用:
let isSuccess = await refreshToken(tokenType: tokenType, refreshToken: refresToken1)

特殊的参数

请求参数为闭包。

比如swift中数组有个.sorted(by: <(Int, Int) throws -> Bool>)方法,sorted是一个排序函数,参数是一个闭包,闭包是一个排序规则。
定义一个处理字符串的函数:

  • 函数定义:
func getString(str1: String, str2: String, closure:(String, String) -> String) -> String {
  return closure(str1, str2)
}
  • 函数调用1,拼接:
let appendStrClosure = { (str1: String, str2: String) in
  return str1 + str2
}
let newStr = getString(str1: "字符串1", str2: "字符串2", closure: appendStrClosure)
print("函数执行结果:", newStr)
  • 函数调用2,替换:
let replaceStrClosure = { (oldString: String, replaceString: String) in
  return oldString.replacingOccurrences(of: replaceString, with: "")
}
let newStr1 = getString(str1: "这是一个测试字符串", str2: "测试", closure: replaceStrClosure)
print("函数执行结果:", newStr1)

尾随闭包。

如果闭包是函数的最后一个参数,那么可以将闭包写在()后面。

  • 函数定义:
    func getString(str1: String, str2: String, closure:(String, String) -> String) -> String {
        return closure(str1, str2)
    }
  • 函数调用:
let newStr1_1 = getString(str1: "这是一个测试字符串", str2: "测试") {
  return $0.replacingOccurrences(of: $1, with: "")
}
print("尾随闭包执行结果:", newStr1_1)
  • 调用结果打印

特殊的返回值

函数的返回值可以是字符串、整型、数组、字典等。类型单一,如果想要返回多个类型,可以使用元组

元组作为函数返回值

例如判断一个字符串是否是一个网址,返回一个布尔值,一个字符串

  • 函数定义:
func isHTTP(text: String) -> (boolValue:Bool, result: String){
  var tuple: (Bool,String)
  if text.hasPrefix("http"){
    tuple = (true, text+"是个网址,可以直接访问")
  } else {
    tuple = (false, text+"不是一个网址")
  }
    return tuple
}
  • 函数调用:
let urlArr = ["https://www.baidu.com", "goole.com"]
  urlArr.forEach { string in
  if isHTTP(text: string).boolValue {
    print(isHTTP(text: string).result)
  } else {
    print(isHTTP(text: string).result)
  }
}
  • 调用结果打印
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容

  • Swift 函数用来完成特定任务的独立的代码块。Swift使用一个统一的语法来表示简单的C语言风格的函数到复杂的O...
    精神薇阅读 585评论 0 0
  • Swift 函数 Swift 函数用来完成特定任务的独立的代码块。Swift使用一个统一的语法来表示简单的C语言风...
    小强七号阅读 369评论 1 2
  • 指定参数标签 :你可以在参数名称前指定它的参数标签,中间以空格分隔: 严格地说,即使没有明确定义返回值,该gree...
    bearIT阅读 339评论 0 0
  • 零、概述 函数的一等公民,可以当做类型、函数参数、返回值等,支持面向函数编程。 每个函数 都是 一个由 函数的 参...
    双鱼子曰1987阅读 779评论 0 1
  • 函数 函数是一段完成特定任务的独立代码片段。你可以通过给函数命名来标识某个函数的功能,这个名字可以被用来在需要的时...
    Longshihua阅读 361评论 0 0