有没有办法知道参数(具有默认值)是否已传递给Swift中的函数?

时间:2014-07-24 04:55:53

标签: ios swift

这是Swift中的一个函数

func flexStrings2 (s1 : String = "", s2 :String = "") -> String {
   return s1 + s2 == "" ? "none" : s1 + s2
}

flexStrings2() // returns "none"
flexStrings2(s1: "Hello!") // returns "Hello!"
flexStrings2(s1: "What's ", s2: "up?") // returns "What's up?"
flexStrings2(s1: "", s2: "") // returns "none"

我正在尝试在Swift中编写一个名为flexStrings2()的函数,它满足以下要求:

  • 该函数可以精确地获取0,1或2个字符串参数。
  • 返回串联为String的函数参数。
  • 如果没有参数传递给函数,它将返回字符串“none”。
  • 仅对函数体使用一行代码

我希望flexStrings2(s1: "", s2: "")返回""而不是"none"

这可以在函数体中的一行代码中完成吗?

这是一个丑陋的解决方案:

func flexStrings2 (s : String...) ->String{
     return s.count == 0 ? "none" : s.count > 2 ? "Maximum 2 parameters" : s.reduce("", combine: {$0 + $1})
}

另外,它不符合调用flexStrings2的语法。

那么有没有办法知道参数(具有默认值)是否已传递给Swift中的函数?

2 个答案:

答案 0 :(得分:4)

Swift建议使用nil来表示变量没有值。您可以使用它来区分没有传递的值和传递的空值,这似乎是必要的,因为您想要区分这两者。

func flexStrings2 (s1 : String? = nil, s2 :String? = nil) -> String {
    return (!s1 && !s2) ? "none" : (s1 ? s1! : "") + (s2 ? s2! : "")
}

flexStrings2() // returns "none"
flexStrings2(s1: "Hello!") // returns "Hello!"
flexStrings2(s1: "What's ", s2: "up?") // returns "What's up?"
flexStrings2(s1: "", s2: "") // returns "" like you wanted

答案 1 :(得分:0)

这并不能应对挑战,因为它可能需要零到多个String参数,但除此之外,我认为它可以实现预期目标,并且使用Variadic参数更容易阅读。

func flexStrings(s: String...) -> String {
    return s.count == 0 ? "none" :  join("", s)
}

https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

func flexStrings(s1: String = "", s2: String = "") -> String {
    return s1 + s2 == "" ? "none": s1 + s2
}

"回答"来自......的挑战#2

http://www.raywenderlich.com/76349/swift-ninja-part-1

挑战是试图说明默认值的使用,但它没有进入可选参数值和使用nil。

未提供的答案可能在技术上更正确,但这是一种可选的噩梦?而且!我希望我们不会在Swift中看到很多因为使用嵌套的三元运算符而更难以阅读。批评不是针对未被发现的,而是挑选出来的?而且!在Swift来源。