• Swift之闭包


    swift中闭包是一个非常强大的东西,闭包是自包括的函数代码块,能够在代码中被传递和使用。跟C 和 Objective-C 中的代码块(blocks)非常相似 。这个大家必须掌握!必须掌握!

    必须掌握。重要的事情要说三遍

    闭包能够捕获和存储其所在上下文中随意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。以下我们就来攻克它!

    1、闭包函数

    官方在解说闭包函数的时候一般都是使用一个sort() 的排序方法。我们来看看这个样例:

    <pre name="code" class="html"><span style="font-size:18px;">let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
    func backwards(s1: String, s2: String) Bool {
        return s1 > s2
    }
    </span>


    
    

    这里我们定义了一个String 类型的数组,然后定义了一个function。接受两个 接收两个String 类型的參数。返回bool

    然后我们来了解下sort() 我们这里对这个数组进行排序 依照我们定义的方法的规则,

    var reversed = names.sort(backwards)
    这个sort() 在swift 2.0增加数组,成为数组的成员方法能够直接调用 ,这里传入与数组类型同样的两个值 ,并返回bool 。假设返回true 就把第一个參数放在第二个前面 (也就是降序),反之你懂的

    所以 。我们这个函数的意思就是假设第一个比第二个參数大就返回true(s1>s2) ,所以是一个降序的排列 ,这里得到的结果是 :[Ewa, Daniella, Chris, Barry, Alex]

    大家看着官方的sort() 也看不到详细的实现,所以这块有可能不是非常清楚 ,那么我们自己写一个排序 ,也传入我们这个函数。

    <span style="font-size:18px;">
    func mySort (var arr:[String] , sortStr:(String,String)->Bool)->[String]
    {
        if(arr.count == 0){ return arr; }
    
        let count = arr.count
        var temp = ""
    
        for i in 0..<count
        {
           for j in i+1..<count
           {
                if(!sortStr(arr[i],arr[j]))
                {
                    temp = arr[i]
                    arr[i] = arr[j]
                    arr[j] = temp
                }
            }
        }
        return arr;
    }
    </span>

    这事实上就是一个简单的冒泡排序 。仅仅只是把规则交给调用者 。
    调用方法 mySort(names, sortStr: backwards) 这里传入的是一个数组和一个函数类型 。得到结果 :[Ewa, Daniella, Chris, Barry, Alex] 跟官方的sort一样的 。

    以下的实例我们就用自己的sort 来讲,代码都在这里。

    大家能够看得明确 。

    这里须要补充一个知识点。

    <span style="font-size:18px;">区间运算 :0...n  表示0-n的闭合区间  0..<n 表示一个包括0 不包括n半开半闭</span><span style="font-size:18px;"><a target=_blank target="_blank" name="t2">
    </a>2、闭包表达式语法</span>

    然而这是一个相当冗长的方式,本质上仅仅是写了一个单表达式函数 (a > b),可是我们还要写一个函数 ? 当然不须要,以下我们用闭合表达式语法能够更好的构造一个内联排序闭包

    <span style="font-size:18px;">闭包表达式语法有例如以下一般形式:
    { (parameters) -> returnType in
            statements
    }
    </span>

    闭包表达式语法能够使用常量、变量和inout类型作为參数。不提供默认值。

    也能够在參数列表的最后使用可变參数。 元组也能够作为參数和返回值。

    <span style="font-size:18px;">let arr1 = mySort( (names) , sortStr: { (s1:String,s2:String) -> Bool in
        return s1>s2
    })
    </span>

    这里我们把上面传入函数的地方,我们传入了一个闭包。这里就不做过多解释。

    全然依照上面的语法类型

    • 依据上下文判断类型

    由于我们写的mySort 第二个參数是类型为(String, String) -> Bool的函数,因此实际上String,String和Bool类型并不须要作为闭包表达式定义中的一部分。 由于全部的类型都能够被正确判断,返回箭头 (->) 和环绕在參数周围的括号也能够被省略:

    所以我们的能够这样写 :

    <span style="font-size:18px;">let arr2 = mySort( (names) , sortStr: { s1,s2 in return s1>s2 })</span>

    看到没,智能的swift帮我们把闭包缩短了非常多

    • 单表达式闭包隐式返回

    单行表达式闭包能够通过隐藏returnkeyword来隐式返回单行表达式的结果。我们这里是单行表达式 。


    注:不要方便的用惯了多行表达式别也给省略了

    <span style="font-size:18px;">let arr3 = mySort( (names) , sortStr: { s1,s2 in s1>s2 })</span>
  • 相关阅读:
    Mysql Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode
    vs2012+ winform+.net4.0发布如何在xp上运行
    ubuntu下手动配置apache2.4.12
    mysql连接错误解决(ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol ref used (client option 'secure_auth' enabled))
    位运算取绝对值
    位运算两数交换
    java mysql prepareStatement模糊查询like使用注意
    idea14远程调试linux下的tomcat
    web视频播放插件:Video For Everybody
    cmd杀死进程
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7270014.html
Copyright © 2020-2023  润新知