我有以下代码:
@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)
}
但我仍然不满意。
答案 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)
}