2016-08-16 87 views
1

我想避免在每個UIViewControllerlet APIHelper = API(),而不是我這樣做:類實例的所有ViewControllers

extension UIViewController { 
    func APIHelper() -> API { 
    let api = API() 
    return api 
    } 
} 

,現在它正在像self.APIHelper().callMethod(),但我真的不知道,如果事情是這樣的去做吧。有關最佳實踐的任何提示?

+2

如何某種基本視圖控制器的地方,你可以用這個聲明擴展?這樣,即使你不需要它,你所有的視圖控制器都有這個功能。 – Miknash

+1

像APIViewController類:UIViewController {讓APIHelper = API()} – JuicyFruit

+1

是的,類似的東西。當你需要它的時候,你只需要繼承那個視圖控制器。 – Miknash

回答

2

您的分機無用的,因爲它只是與調用API()每次

self.APIHelper().callMethod() 
self.APIHelper().callSecondMethod() //here you created another API instance 

一樣

API().callMethod() 
API().callSecondMethod() 

如果API是singletone,想法看起來不錯,但在迅疾你通常會創建帶靜態常數的singletone:

class API { 
    static let sharedAPI = API() 
    //... 
} 

並獲得這樣的:

API.sharedAPI.callMethod() 
API.sharedAPI.callSecondMethod() //now called in same API instance 

如果你不想寫API.sharedAPI每次,那麼你可以使用:

您的擴展

extension UIViewController { 
    var apiHelper: API {return API.sharedAPI} 
} 

不推薦@NickCatib解釋。

基本視點控制器

如@NickCatib建議(更容易與變量):

class BaseViewController: UIViewController { 
    // some of the code you might need 
    let apiHelper = API.sharedAPI 
} 

協議

如果使用API​​在視圖控制器不時,可以是更好地宣佈協議

protocol APIHelper { 
    var apiHelper: API {get} 
} 

與默認實現

extension APIHelper { 
    var apiHelper: API {return API.sharedAPI} 
} 

,並僅在需要時

class ViewControllerThatNeedsAPI: UIViewController, APIHelper { 
    // apiHelper avalible here 
} 

與所有三個方面,它連接到您的viewController您訪問API是這樣的:

apiHelper.callMethod() 
+0

只是一個簡單的說明 - 單身人士確實讓你感覺最終會改變的變量,否則它是矯枉過正的 - 它應該是靜態類。 – Miknash

+0

@NickCatib「靜態類」 - 你是指類,不能有實例?你知道它的任何實現嗎?或者,如果你的意思是「靜態類」,沒有任何存儲屬性的類,所以實際上所有的實例都是相同的 - 然後OP可以在任何地方使用「API()」,但是我認爲singletone比許多平等實例更好。 –

+0

靜態類是所有她的屬性和方法都是靜態的類 - 所以你有基本的URL設置一次,就是這樣,你不需要存儲任何動態的東西。它實際上會像這樣:Service.API()。 – Miknash

1

如何使用該聲明擴展某種基本視圖控制器?這樣,即使你不需要它,你所有的視圖控制器都有這個功能。

這會是這樣

class BaseViewController: UIViewController { 
    // some of the code you might need 
    func APIHelper() -> API { 
    let api = API() 
    return api 
    } 
} 

及更高版本:

class ViewControllerThatNeedsAPI : BaseViewController { 
    // You have it here 
} 

,我實際使用是有API調用服務/管理器處理的是,併發送所需的所有數據的另一種方法通過委託/ NSNotification /完成處理程序。這樣你的代碼就會更乾淨,更容易測試(如果你練習測試的話)。如果你把所有東西放在視圖控制器中,你將會破壞SRP。這些經理是PONSO - Plain舊ns對象。您可以使用與視圖控制器相同的方式,並使用一些帶有API URL的BaseService,需要重寫的基本內容等。之後,您只需實現服務並在需要時調用它,具體取決於實現方式是否具有將數據反映到UI。

相關問題