我只是在试验一些SWIFT代码样本,通过犯一个错误,我发现了我们非常奇怪的行为(对我来说),我不明白.

我已经定义了这个函数:

func makeIncrementer(number: Int) -> ((Int) -> Int) {
  func incrementer(inputNumber: Int) -> Int {
    return inputNumber+1
  }
  return incrementer
}

*是的,没有使用中的参数编号,这是无意的错误,但导致了我现在询问的这个奇怪的行为.

然后我调用了代码:

let functionVariable = makeIncrementer(number: 7)
print(functionVariable)
print(functionVariable(7))

这导致了以下输出:

(Function) 
8

在这之后,我意识到make Incrementer函数中的number参数没有意义,所以我删除了make Incrementer调用中的参数,但Xcode没有显示任何错误消息.所以我试着重建这个:

let functionVariable = makeIncrementer(number: )
print(functionVariable)
print(functionVariable(7))

我收到了这样的结果:

(Function)
(Function)

以下是我的问题:

  1. 它怎么可能建成呢?参数编号不是可选的,还是可选的?
  2. 即使参数编号是可选的,它怎么会产生两个函数类型的对象呢?

非常感谢你的解释

*[编辑]-更正了拼写错误,原来是Print(UnctionVariabl)而不是print(UnctionVariable)

推荐答案

在第二个示例中,您没有调用函数,而是使用变量的重载标识符将其赋值给变量.这也是它打印(Function)两次的原因;第一次是原始函数,第二次是返回的Curry函数.

下面是一个为接受String的函数定义重载的示例,表明let functionVariable1 = makeIncrementer(number:)正在将接受Int的函数的特定重载赋给变量.调用这个变量functionVariable1(4)现在不再需要(也不会接受)参数标签,并返回您的Curry函数.因此,调用print(functionVariable1(4)(11))现在将按预期打印输入+1.

func makeIncrementer(number: Int) -> ((Int) -> Int) {
    func incrementer(inputNumber: Int) -> Int {
        return inputNumber + 1
    }
    return incrementer
}

func makeIncrementer(string: String) -> ((Int) -> Int) {
    func incrementer(inputNumber: Int) -> Int {
        return inputNumber + 1
    }
    return incrementer
}

let functionVariable1 = makeIncrementer(number:)
print(functionVariable1)
print(functionVariable1(4)(11))
// no error because the overload expecting an Int is assigned to functionVariable1

let functionVariable2 = makeIncrementer(string:)
print(functionVariable2)
print(functionVariable2("string")(11))
// no error because the overload expecting a String is assigned to functionVariable2

对于接受多个参数的函数定义,可以按顺序列出参数标签以分配给变量,这也消除了在以后的调用中使用标签的需要.

func fn(number: Int, string: String) {
    print("number: \(number)")
    print("string: \(string)")
}

let assigneOverload = fn(number: string:)
assigneOverload(1, "swift")

Ios相关问答推荐

如何在进行滑动删除操作时保持自定义视图背景静态

我想在expo 中使用useSafeAreaInsets来获取paddingbottom,但我得到了一个错误

DriverKit驱动程序中可能存在IOBufferMemoyDescriptor泄漏

与iPadOS中带有扣件的模式相似的组件是什么?

设置托管在DigitalOcean上的iOS通用链接

如何在 Swift 中存储具有关联值的协议?

如何使用自定义数据源在本地react 本机 ios 应用程序中加载 Tradingview 小部件?

PropertyWrapper 不存在的 Codable 属性的默认值

具有多个目标的应用程序的动态内容

clipShape swift的三元

TextField 重复输入 SwiftUI

iOS,Swift 5,AppDelegate open url / .onOpenUrl - 如何找到调用我的自定义方案的调用应用程序

Watchkit AppIcon - 名为AppIcon的应用图标集没有任何适用的内容

如何使用 Swift 从assets资源 中加载特定图像

在原生和 phonegap 之间挣扎,简单的应用需求

检测 iOS UIDevice 方向

如何判断是否为 64 位构建了静态库?

为信用卡输入格式化 UITextField,例如 (xxxx xxxx xxxx xxxx)

如果已安装,则重定向到应用程序,否则重定向到 App Store

Twitter api 文本字段值被截断