【问题标题】:Is there a way to know if a parameter (with a default value) has been passed to a function in Swift?有没有办法知道参数(具有默认值)是否已传递给 Swift 中的函数?
【发布时间】:2014-07-24 04:55:53
【问题描述】:

这是 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 个字符串参数。
  • 以字符串形式返回函数参数。
  • 如果没有参数传递给函数,它将返回字符串“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 中的函数?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢 :) 这正是我想要的
    【解决方案2】:

    这不符合挑战,因为它可以接受零到多个字符串参数,但除此之外,我认为它可以达到预期的效果,并且使用可变参数更易于阅读。

    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 源代码中。

    【讨论】:

    • 是的,我不得不编辑我的答案,因为这个问题专门要求它放在一行上。我的原始回复在其自己的声明中具有初始条件(空检查)。我不希望在我自己的代码中以这种形式出现。
    • @kasplat 是的,他们对挑战的回答并不让我满意。至于使用可变参数,我已经在我的问题中评论了这种解决方案。无论如何,谢谢!
    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2018-12-17
    • 2022-01-03
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多