Xcode 如何使用可选参数值优雅地处理零检查?

Xcode 如何使用可选参数值优雅地处理零检查?,xcode,swift,Xcode,Swift,我有以下代码: @IBAction func search(sender: AnyObject) { let searchWord = searchQ.text let r = searchRadius.text let latitude = searchLat.text let longitude = searchLon.text customSearch(searchWord!, radius: r!, lat: latitude!, lon: lon

我有以下代码:

@IBAction func search(sender: AnyObject) {
    let searchWord = searchQ.text
    let r = searchRadius.text
    let latitude = searchLat.text
    let longitude = searchLon.text
    customSearch(searchWord!, radius: r!, lat: latitude!, lon: longitude!)
}
方法
customSearch
设置了默认参数,以防用户未输入任何内容,因此

如何检查searchWord、r、纬度和经度是否为零。如果为nil,则使用customSearch函数默认参数,否则,使用提供的参数,并用默认值填写其余的参数

哦,更详细地说,显然如果我取一个文本字段的值,它是空的,它不是nil,而是一个空字符串。。因此,我添加了以下内容:

func customSearch(q:String = "", radius:String = "25", lat:String = "33.960", lon:String = "-118.4179") {
    let geoSearchWord = (q == "" ? q : "geoSearchWord=\(q)")
    let geoSearchLat = (lat == "" ? "33.960" : "&geoSearchWordLat=\(lat)")
    let geoSearchLon = (lon == "" ? "-118.4179" : "&geoSearchWordLon=\(lon)")
    let geoSearchRadius = (radius == "" ? "25" : "&geoSearchWordRadius=\(radius)")

    let twitterURLRequest: String = "https://quiet-cove-5048.herokuapp.com/tw?\(geoSearchWord)\(geoSearchLat)\(geoSearchLon)\(geoSearchRadius)"
    alamoRequest(twitterURLRequest)
}

但我还是不满意。

不幸的是,函数中的默认参数似乎是全部或全无。实际上,您有两个函数签名:一个使用默认值,另一个不使用


如果
customSearch
是您控制的函数,您可以重写它以接受可选参数,并在函数实现中指定默认值。

您的实现是否可以不在
customSearch
函数中使用默认参数

如果是这样的话,你可以试试这样的

@IBAction func search(sender: AnyObject) {
    let searchWord = searchQ.text ?? "defaultWord"
    let r = searchRadius.text ?? "defaultR"
    let latitude = searchLat.text ?? "defaultLatitude"
    let longitude = searchLon.text ?? "defaultLongitude"
    customSearch(searchWord, radius: r, lat: latitude, lon: longitude)
}

// where customSearch function might look like this
func customSearch(word: String, radius: String, lat: String, lon: String) {

   /*...*/
}
另一种方法是在
customSearch
函数中移动此逻辑:

@IBAction func search(sender: AnyObject) {
    let searchWord = searchQ.text
    let r = searchRadius.text
    let latitude = searchLat.text
    let longitude = searchLon.text
    customSearch(searchWord, radius: r, lat: latitude, lon: longitude)
}

// where customSearch function might look like this
func customSearch(word: String?, radius: String?, lat: String?, lon: String?) {

    let searchWord = word ?? "defaultWord"
    let r = radius ?? "defaultR"
    let latitude = lat ?? "defaultLatitude"
    let longitude = lon ?? "defaultLongitude"
}

如果让,则使用

@IBAction func search(sender: AnyObject) {

    if  let searchWord = searchQ.text,
            r = searchRadius.text,
            latitude = searchLat.text,
            longitude = searchLon.text {
        customSearch(searchWord, radius: r, lat: latitude, lon: longitude)
    }
} 
只有当发现所有四个
let
都不是
nil
时,才会执行
customSearch
方法。因此,您的代码将保证在不崩溃的情况下安全执行

此外

方法
customSearch
的更改是指定默认参数,如果调用该方法时根本没有传递某些参数。如果你不及格,那就不行了。 例如,如果调用
customSearch()
,而不传递任何参数值,则所有4个参数都将采用默认值,依此类推

如果您同意在参数中使用nil值,请按如下方式更改
customSearch
方法实现:

func customSearch(q:String?, radius:String?, lat:String?, lon:String?) {
    let geoSearchWord = (q == nil ? "" : "geoSearchWord=\(q)")
    let geoSearchLat = (lat == nil ? "33.960" : "&geoSearchWordLat=\(lat)")
    let geoSearchLon = (lon == nil ? "-118.4179" : "&geoSearchWordLon=\(lon)")
    let geoSearchRadius = (radius == nil ? "25" : "&geoSearchWordRadius=\(radius)")

    let twitterURLRequest: String = "https://quiet-cove-5048.herokuapp.com/tw?\(geoSearchWord)\(geoSearchLat)\(geoSearchLon)\(geoSearchRadius)"
    alamoRequest(twitterURLRequest)
}
参数类型旁边的
允许它们为零

最后,在调用该方法时,请确保不要预先打开任何参数,如下所示:

    @IBAction func search(sender: AnyObject) {
        customSearch(searchQ.text, radius: searchRadius.text, lat: searchLat.text, lon: searchLon.text)
    } 

问题是,我同意任何或所有的值都为零。这就是为什么我会有默认参数。也就是说,如果传入nil,它将变为默认值,否则它将使用提供的值。这不是所有四个都不是零的情况,一个或两个或三个或所有四个都可以是零,任何组合。现在,任何或所有参数都可以为零。另外,在调用这些方法时,不要强制展开textfields的任何
.text
属性,让参数保持可选。是的,这基本上就是我所做的,但是谢谢你会给你答案!