【问题标题】:swift how to return function with same argument usage of default value and labelswift如何使用默认值和标签的相同参数使用返回函数
【发布时间】:2021-07-07 03:20:22
【问题描述】:

我想返回一个函数并在代码中以 bb 的形式调用它

func bb(a: Int, b: String = "b") {
  print(a, b)
}

typealias FnOfBb = (Int, String) -> Void

func cc() -> FnOfBb {
  return bb
}

bb(a: 1) // is ok

cc()(a: 1) // desired, but show Error: Extraneous argument label 'a:' in call  and  Missing argument for parameter #2 in call

cc()(1, "str") // is ok, but different of bb

aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 000 aaa 0000 aaa 0000 aaa aa0 000

【问题讨论】:

    标签: swift function types


    【解决方案1】:

    问题是闭包不能有外部命名的参数,这就是你的cc()(a: 1) 给你一个错误的原因。

    如果保留外部命名的参数很重要,您将不得不使用像函数一样可调用但不是函数的东西:

    @dynamicCallable struct Callable
    {
        let closure: (Int, String) -> Void
        func dynamicallyCall(withKeywordArguments args: KeyValuePairs<String, Int>)
        {
            let a = Int(args.first?.value ?? 0)
            let b = args.count > 1 ? String(args[1].value) : "b"
            closure(a, b)
        }
    }
    
    func bb(a: Int, b: String = "b") {
      print(a, b)
    }
    
    func cc() -> Callable {
        return Callable(closure: bb)
    }
    
    cc()(a: 1)
    

    打印

    1 b
    

    这可能不是您想要的。例如,给定相同的定义,它将接受:

    cc()(foo: 5) // accepts different external name
    

    打印

    5 b
    

    您可以在 Callable 中检查这一点,但这是运行时的事情:

    @dynamicCallable struct Callable
    {
        let closure: (Int, String) -> Void
        func dynamicallyCall(withKeywordArguments args: KeyValuePairs<String, Int>)
        {
            precondition(args.count > 0 && args.first!.key == "a")
            let a = Int(args.first?.value ?? 0)
            let b = args.count > 1 ? String(args[1].value) : "b"
            closure(a, b)
        }
    }
    

    现在这将编译,但会在运行时fatalError

    cc()(foo: 5) // Precondition fails here
    

    至于默认值...据我所知,没有办法从分配的函数中推断出它们,所以我认为没有解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-13
      • 2012-08-03
      • 1970-01-01
      • 2022-11-24
      • 2020-12-22
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      相关资源
      最近更新 更多