这是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()
的函数,它满足以下要求:
我希望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中的函数?
答案 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)
}
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来源。