您的位置:首页 > 移动开发 > Swift

Swift方法嵌套

2016-04-20 00:56 330 查看
想想看,有多少次我们因为一个方法主体内容过长,而不得不将它重够为好几个小的功能模块方法,然后在原来的主体方法中去调用这些小方法?

在Swift中,对于这种情况有了解很好的应对措施,我们可以在方法中定义其他方法,也就是说,让方法嵌套起来。

例如:

func appendQuery(var url:String, key:String, value:AnyObject) -> String {

if let dictionary = value as? [String:AnyObject] {

return appendQueryDictionary(url, key, dictionary)

} else if iet array = value as? [AnyObject] {

return appendQueryArray(url, key, array)

} else {

return appendQuerySingle(url, key, value)

}

}

func appendQueryDictionary(var url:String, key:String, value:AnyObject) -> String {

//...

return result

}

func appendQueryArray(var url:String, key:String, value:AnyObject) -> String {

//...

return result

}

func appendQuerySingle(var url:String, key:String, value:AnyObject) -> String {

//...

return result

}

事实上后三个方法都只会在第一个方法中被调用,它们其实和Request没有直接关系,所以将它们放到appendQuery中去会是一个更好的组织形式:

func appendQuery(var url:String, key:String, value:AnyObject) -> String {

func appendQueryDictionary(var url:String, key:String, value:AnyObject) -> String {

//...

return result

}

func appendQueryArray(var url:String, key:String, value:AnyObject) -> String {

//...

return result

}

func appendQuerySingle(var url:String, key:String, value:AnyObject) -> String {

//...

return result

}

if let dictionary = value as? [String:AnyObject] {

return appendQueryDictionary(url, key, dictionary)

} else if iet array = value as? [AnyObject] {

return appendQueryArray(url, key, array)

} else {

return appendQuerySingle(url, key, value)

}

}

虽然Swift提供了public、internal和private三种访问权限,但是有些方法我们完全不希望在其他地方呗直接使用。最常见的例子就是在方法模板中,我们一方面希望提供一个模板来让使用者可以灵活地通过模板定制他们想要的方法,但另一方面又不希望暴露太多细节,或者让使用者可以直接调用到模板。

一个最简单的例子:

func makeIncrementor(addNumber:Int) -> ((inout Int) -> ()) {

func incrementor(inout variable:int) -> () {

variable += addNumber;

}

return incrementor

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: