(作业)Swift闭包、扩展、泛型

在Swift中经常会使用到一些基本的函数,通过使用这些函数也可以学习到Swift中的一些语法,如:闭包、扩展和泛型。接下来,我们就通过一个作业来了解一下。

作业要求如下:

/// question: 1
let dic = [["name": "zhangsan", "age": 18], ["name": "lisi", "age": 19], ["name": "wangwu", "age": 20]]

let str = dic.map( { $0["name"]! } )  //返回字典数组中每个字典元素的"name"对应的值
print(str)  //输出["zhangsan", "lisi", "wangwu"]


/// question: 2
let arr1 = ["ajsfhu", "182has8f", "187326478", "123"]
let arr2 = arr1.filter( { Int($0) != nil } )  //先将字符串元素强转为Int?,如果值为nil,则表示该字符串不能转换成Int
print(arr2)  //输出["187326478", "123"]


/// question: 3
let arr3 = ["ajsfhu", "182has8f", "187326478"]
var str1 = arr3.reduce("", { $0 + "," + $1 }) //将字符串数组整合
str1.remove(at: str1.startIndex)  //因为整合结果的字符串的第一个字符为",",所以需要将这个","移除
print(str1)  //输出ajsfhu,182has8f,187326478


/// question: 4
let tuple = intArr.reduce((max: intArr[0], min: intArr[0], sum: 0), { (max: max($0.max, $1), min: min($0.min, $1), $0.sum + $1) })
print(tuple)  //输出(44, 11, 99)


/// question: 5
func f1(a: Int) -> Int {
    return a
}  //函数类型为(Int) -> Int

func f2(a: String) -> Int {
    return Int(a)!
}  //函数类型为(String) -> Int

func f3() -> Int {
    return 2
}  //函数类型为() -> Int

func f4(a: Int) {

}  //函数类型为(Int) -> Void

func f5(a: Int) -> Int {
    return a + 1
}  //函数类型为(Int) -> Int

let funArr: [Any] = [f1, f2, f3, f4, f5]
for (index, value) in funArr.enumerated() { //因为循环过程中需要设计到数组的下标,要将数组元素一一列举出来,所以需要调用数组的enumerated()方法。
    if value is (Int) -> Int {
        print(index)  //输出类型为(Int) -> Int的函数在数组中的下标,
    }
}  //输出结果为0 (换行)  4


/// question: 6
extension Int {
    //因为直接使用系统的sqrt(Double)函数会与扩展中定义的函数冲突,所以需要指定系统函数的框架

    /// 求平方根
    ///
    /// - Returns: 返回该Int型数据的平方根
    func sqrt() -> Double {
        return Darwin.sqrt(Double(self))
    }
}

print(4.sqrt())  //输出2.0


/// question: 7
//自定义泛型函数,因为需要比较大小,所以该泛型需要遵循Comparable协议,函数参数为可变参数

/// 返回参数中的最大值和最小值
///
/// - Parameter a: 一组可以直接比较大小的值
/// - Returns: 返回一个元组,第一个值为最大值,第二个值为最小值
func getMaxAndMin<T: Comparable>(a: T...) -> (T, T) {
    var max = a[0]
    var min = a[0]

    for item in a {
        if item > max {
            max = item
        } else if item < min {
            min = item
        }
    }

    return (max, min)
}

print(getMaxAndMin(a: 1, 2, 3, 9, 2, 88))  //输出(88, 1)
print(getMaxAndMin(a: 1.0, 2.0, 3.0, 9.0, 2.0, 88.0))  //输出(88.0, 1.0)
print(getMaxAndMin(a: "a", "b", "A", "sss"))  //输出("sss", "A")

下面来介绍一下这次作业中用到的系统函数的用法:
map:
map函数常用于将数组中的每一个元素,通过指定的方法进行转换,然后返回一个结果数组。其参数是一个闭包,闭包内容就是你对每个函数的转换方法。map函数就像一个系统自定义的循环,每一次循环都会调用你的闭包来对每个元素进行转换,所以其最多只能使用到$0。

filter:
filter函数见名知意,就是对数组中的所有元素进行过滤,筛选出满足条件的元素,并返回结果数组。filter函数的参数也是一个闭包,它跟map函数相似,但filter函数却不改变元素的值,而map函数会改变元素的值。

reduce:
reduce函数常用来整合一个数组,将数组中的元素按一定方法整合之后,返回一个整合的结果。reduce函数有两个参数,第一个参数为初始值,第二个参数为一个闭包,闭包的内容为你整合的方法。因其整合过程中最多对相邻的两个元素进行操作,所以其语法糖最多使用到$1。

enumerated:
enumerated方法为数组的列举方法,常与for-in循环搭配使用,其返回结果可以看作为一个元组数组,元组的第一个值为该元素在数组中的下标,第二个值为该元素。

sqrt:
sqrt为系统内置的求平方根函数,其传入的参数为Double类型,返回值也是Double类型。还有一个与其相似的函数sqrtf,这个函数功能与sqrt一样,只是其参数和返回值均为Float类型。

至于本次作业要求中的扩展和泛型,因博客内容的统一与篇幅限制不方便在这篇博客中继续讲解,在以后的更新中我会更新相关内容的博客,还请多关注我的博客。

发布了45 篇原创文章 · 获赞 20 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/average17/article/details/77970154