gpt4 book ai didi

swift - 关于 Swift 函数、命名参数和类型管理

转载 作者:行者123 更新时间:2023-11-30 12:53:10 25 4
gpt4 key购买 nike

假设我有一个重载的函数:

func doMath(mathOption: String) -> (Int...) -> Double {
...
return average
}

func doMath(mathOption: String) -> ([Int]) -> Double {
...
return average
}

旁注:函数 average 本身已重载,可以接受数组作为输入或参数列表。

两个问题:

1 - 如何引用我所引用的函数?

例如:

let doAverage = doMath(mathOption: "average")

如何指定我正在调用哪个 doMath 函数? Swift 很困惑,无法从下一行推断:

如果我稍后写:

doAverage(1,2,3,4)

2 - 如何命名参数?原始平均函数的调用方式如下:

average(nums: 1,2,3,4)

我必须命名参数。然而,对于 doAverage,由于返回类型的定义方式,我无法命名参数。

3 - 我如何创建一个类型(也许使用结构?)来简化这个假设的代码。

感谢您提供的任何帮助、解释或答案!

<小时/>

编辑,澄清3,这是情况的扩展版本:

func sumAll(nums: [Int]) -> Double {
return Double(nums.reduce(0, { (a,b) in a+b}))
}

func sumAll(nums: Int...) -> Double {
return sumAll(nums: nums)
}


func average(nums: [Int]) -> Double {
return sumAll(nums: nums) / Double(nums.count)
}

func average(nums: Int...) -> Double {
return average(nums: nums)
}

func doMath(mathOption: String, nums: Int...) -> Double {
if mathOption == "average" {
return average(nums: nums)
} else {
return sumAll(nums: nums)
}
}

typealias mathReturnType1 = (Int...) -> Double
typealias mathReturnType2 = ([Int]) -> Double


func doMath(mathOption: String) -> mathReturnType1 {
return average
}

func doMath(mathOption: String) -> mathReturnType2 {
return average
}

我使用typealias 创建了两个示例类型。是否可以以某种方式重载类型来处理这两种情况?对我来说,这是有道理的,因为如果重载相同的函数来处理不同的输入,为什么类型不重载呢?也许这是一个天真的观点,或者也许有一种方法可以在 Swift 中表达我的想法?

最佳答案

如何引用函数?只需指定类型即可!

func doMath(mathOption: String) -> (Int...) -> Double {
return { (values: Int...) -> Double in
return Double(values.reduce(0, +)) / Double(values.count)
}
}

func doMath(mathOption: String) -> ([Int]) -> Double {
return { (values: [Int]) -> Double in
return Double(values.reduce(0, +)) / Double(values.count)
}
}

let average1 = doMath(mathOption: "x") as (Int...) -> Double
print(average1(1, 2, 3))

let average1: (Int...) -> Double = doMath(mathOption: "x")
print(average1(1, 2, 3))

我还建议使用 typealias 来命名该类型。

你的第二个问题 - 你不能命名函数类型中的参数。

关于swift - 关于 Swift 函数、命名参数和类型管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40715514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com