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

时间:2016-03-21 22:05:08

标签: 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: longitude!)
}

方法customSearch设置了默认参数,以防用户放入任何内容,所以......

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

哦,并且详细说明,显然如果我采用文本字段的值,并且它是空的,它不是零而是空字符串..所以我添加了以下内容:

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)
}

但我仍然不满意。

3 个答案:

答案 0 :(得分:1)

您的实现是否可以在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"
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用if-let

@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)
    }
} 

仅当发现所有四个customSearch都不是lets时,才会执行nil方法。因此,您的代码将保证安全执行而不会崩溃。

<强>此外

对方法customSearch所做的更改是指定默认参数,如果在调用方法时某些参数未通过。如果你传递nil,它将无法工作。 例如,如果您在不传递任何参数值的情况下调用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)
    }