Swift 里面的函数

个人感觉,函数的应用是swift改变最大的一块。相对于OC,swift里面的函数更加强大高效率。
并且在Swift里,函数经常像对象一样使用。
下面我将逐一介绍Swift中函数的作用

1 Swift 的函数格式

  • Swift 的函数格式与OC的有很大不同。但从格式上说跟Java有点类似,也有点不同。

格式:
func 函数名称(参数列表) -> 返回值
语义: 将前面的计算结果, 输出给后面的返回值

没有参数没有返回值

  1. 可以写为 ->Void
  2. 可以写为 ->()
  3. 可以省略

<pre><code>
func sum3(a: Int, b: Int) ->Int{

return a + b

}

sum3(9,6)
</code></pre>

  • 当然函数可以被private,pubilc 修饰,来决定是否需要被外部访问

  • 当然闭包也是一种函数,我们下面介绍。

  • Swift引入了大量的函数式编程,我们是可以把函数当做对象处理(赋值,当做参数传递,可以当做返回值)
    <pre><code>
    let yFunc = {()->String
    in
    return "linghulingxi"
    }
    //返回值
    func factory<T>(value: T)->(T->T) {

    func add(value2: T) -> T {

      return value
    

    }

    return add

}
</pre></code>

2 函数参数

  • 在Swift中,函数可以像OC那样通过参数传值。但是Swift 比OC更加复杂,形式更加多样。
    • 1 参数默认值 可以为任何参数设定默认值来作为函数的定义的一部分。如果默认值已经定义,调用函数时就可以省略该参数的传值。
      <pre><code>
      func join(string s1: String, toString s2: String, withJoiner joiner: String = "hello") -> String {

      return s1 + joiner + s2

}
</pre></code>

* * 2 可变参数 一个可变参数的参数接受零个或多个指定类型的值。当函数被调用时,您可以使用一个可变参数的参数来指定该参数可以传递不同数量的输入值。写可变参数的参数时,需要参数的类型名称后加上点字符(...)。

<pre><code>
func arithmeticMean(numbers: Double...) -> Double {

var total: Double = 0

for number in numbers {

    total += number
}
return total / Double(numbers.count)

}
arithmeticMean(1, 2, 3, 4, 5)
</pre></code>

* * 参数的省略 函数的参数在Swift 中常常可以被省略(Swift有类型推导)例子:

<pre><code>
let array = [1, 3, 2, 4]

let res = array.sort {

(a: Int, b: Int) -> Bool in

return a < b

}
//返回类型、参数的类型、以及参数的个数,都能推导出来所以可以简化为
let array = [1, 3, 2, 4]

let res = array.sort {

return $0 < $1

}

</pre></code>

* * 参数中的关键字
    1. @noescape 它是专门用于修饰函数闭包这种参数类型的,当出现这个参数时,它表示该闭包不会跳出这个函数调用的生命期:即函数调用完之后,这个闭包的生命期也结束了
    1. throws 关键字表示:这个函数(闭包)可能抛出异常。而 rethrows 关键字表示:这个函数如果抛出异常,仅可能是因为传递给它的闭包的调用导致了异常。
* * 函数作为参数

在Swift中可以像对象一样,被当作参数传递或者被当作值返回
<pre><code>
// Alamofire.request(Router.GetOptionalList("789afd225bd2443691204a486657696d")).validate().responseJSON { response in
print("request-> (response.result.value)")
let data : NSArray = response.result.value!.valueForKey("data")as! NSArray
print("dfajnjksfnasnfa(response.request)")

        self.listCount = data.count
        for obj in data {
          //  print("dfajnjksfnasnfa \(obj)")
            //let dict: NSDictionary = (try! NSJSONSerialization.JSONObjectWithData(obj as! NSData, options: .AllowFragments)) as! NSDictionary
            let modelTool = DictModelManager.sharedManager
            let data1 = modelTool.objectWithDictionary(obj as! NSDictionary, cls: OptionModel.self) as? OptionModel
            print(data1?.change)
          
            //self.getdata(data!)
           
            completion(data: data1,Count: self.listCount!,error: nil)
              }
            
        }

//map函数
let arry = [1, 2, 3]

let arr1 = arry.map {
"No." + String($0)
}
//["No.1", "No.2", "No.3"]
</pre></code>

* 参数的泛型

当函数中的参数再引入范型之后,函数的功能更加强大,但是可读性进一步下降。比如刚刚的例子,限制函数只能是 Int -> Int 其实是没有必要的,我们将两个函数拼成一个函数,只需要保证一个函数的输出类型,与另一个函数的输入类型匹配即可。
<pre><code>
func funcBuild<T, U, V>(f: T -> U, _ g: V -> T)
-> V -> U {

    return {

        f(g($0))

    }

}

let f3 = funcBuild({ "No." + String($0) }, {$0 * 2})

f3(23) // 结果是 "No.46"

</pre></code>

3 函数的返回值

  • Swift的返回值是写在方法后面的用 (->返回值表示)
  • Swift 的返回值为空时可以省略
  • Swift的返回值可以像参数一样传递函数(闭包)(像是一些链式函数)
    <pre><code>
    //snapkit 里面的代码
    public func snp_makeConstraints(file: String = #file, line: UInt = #line, @noescape closure: (make: ConstraintMaker) -> Void) -> Void {
    ConstraintMaker.makeConstraints(view: self, file: file, line: line, closure: closure)
    }

</pre></code>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容