本篇分為兩部分: 一、Swift中的方法嵌套 二、Swift中的命名空間 在 swift 中我們可以讓方法嵌套方法,如: 我們之前在使用 OC 開發時,它是沒有命名空間的,所有的代碼和引用的靜態庫最終都會被編譯到同一個域和二進位中,這樣的後果是一旦我們有重覆的類名的話,就會導致編譯時的衝突和失敗。為
本篇分為兩部分:
一、Swift中的方法嵌套
二、Swift中的命名空間
一、Swift中的方法嵌套
在 swift 中我們可以讓方法嵌套方法,如:
func appendQuery(var url: String, key: String, value: AnyObject) -> String { func appendQueryDictionary(url: String, key: String, value: [String: AnyObject]) -> String { //... return "result" } func appendQueryArray(url: String, key: String, value: [AnyObject]) -> String { //... return "result" } func appendQuerySingle(url: String, key: String, value: AnyObject) -> String { //... return "result" } if let dictionary = value as? [String: AnyObject] { return appendQueryDictionary(url, key: key, value: dictionary) } else if let array = value as? [AnyObject] { return appendQueryArray(url, key: key, value: array) } else { return appendQuerySingle(url, key: key, value: "value") } }
二、Swift中的命名空間
我們之前在使用 OC 開發時,它是沒有命名空間的,所有的代碼和引用的靜態庫最終都會被編譯到同一個域和二進位中,這樣的後果是一旦我們有重覆的類名的話,就會導致編譯時的衝突和失敗。為了避免這種事情的發生,OC 的類型一般都會加上兩到三個字母的首碼,比如 MJExtense,MJRefresh,MBProgressHUD 這樣。但是首碼並不意味著保證能夠不衝突,Swift 使用命名空間後為我們解決了該問題
// MyFramework.swift // 這個文件存在於 MyFramework.framework 中 public class MyClass { public class func hello() { print("hello from framework") } } // MyApp.swift // 這個文件存在於 app 的主 target 中 class MyClass { class func hello() { print("hello from app") } } MyClass.hello() // hello from app MyFramework.MyClass.hello() // hello from framework
另一種策略是使用類型嵌套的方法來指定訪問的範圍
struct MyClassContainer1 { class MyClass { class func hello() { print("hello from MyClassContainer1") } } } struct MyClassContainer2 { class MyClass { class func hello() { print("hello from MyClassContainer2") } } } // 使用時: MyClassContainer1.MyClass.hello() MyClassContainer2.MyClass.hello()
這樣我們就可以避免去使用一些稀奇古怪的首碼了。