Swift 柯里化(Currying)应用

634 阅读1分钟

柯里化(Currying)

在 Swift 中,柯里化(Currying)是指将一个多参数函数转换为一系列单参数函数的过程。 这样,每次调用函数时只传入一个参数,返回一个新的函数,该函数接收下一个参数

1. 简单的柯里化函数

假设我们有一个接受两个整数参数并返回它们和的函数,可以通过柯里化将其转换成一系列单参数函数

func add(_ x: Int) -> (Int) -> Int {
    return { y in
        return x + y
    }
}

// 使用柯里化函数
let addFive = add(5)
print(addFive(3))  // 输出 8

2. 柯里化特别适合用于部分应用。例如,如果我们有一个函数用于检查字符串是否具有指定的前缀

func hasPrefix(_ prefix: String) -> (String) -> Bool {
    return { string in
        return string.hasPrefix(prefix)
    }
}

// 创建一个带特定前缀的检查函数
let hasHttpPrefix = hasPrefix("http")

// 使用这个函数
print(hasHttpPrefix("http://example.com"))  // 输出 true
print(hasHttpPrefix("https://example.com")) // 输出 true
print(hasHttpPrefix("ftp://example.com"))   // 输出 false

3. 通过柯里化,我们可以用部分应用(Partial Application)实现依赖注入,从而构建模块化、灵活的函数。

示例:日志记录器的依赖注入

假设我们有一个简单的日志记录器,需要传入不同的日志前缀

func logger(prefix: String) -> (String) -> Void {
    return { message in
        print("\(prefix): \(message)")
    }
}

let errorLogger = logger(prefix: "ERROR")
let infoLogger = logger(prefix: "INFO")

errorLogger("File not found.")   // 输出: ERROR: File not found.
infoLogger("User logged in.")    // 输出: INFO: User logged in.