class 所有 ViewController 的实例

class instance to all ViewControllers

我希望避免在每个 UIViewController 中写 let APIHelper = API(),而是这样做的:

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

现在它像 self.APIHelper().callMethod() 一样工作,但我不确定这是否是实现它的方法。关于最佳实践的任何提示?

可以使用该声明进行扩展的某种基本视图控制器怎么样?这样,您所有的视图控制器都具有该功能,即使您不需要它也是如此。

这会像

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
}

我实际使用的另一种方法是让 service/manager 调用 API 来处理它,并通过 delegate/NSNotification/completion 处理程序发送所有需要的数据。这样你的代码将更清晰,更容易测试(如果你练习测试)。如果您将所有内容都保留在视图控制器中,您将破坏 SRP。这些管理器是 PONSO - 普通的旧 ns 对象。您可以使用与视图控制器相同的方式,并使用 API URL 的一些 BaseService,需要覆盖的基本内容等。之后您只需实现服务并在需要时调用它 - 取决于实现有一些功能可以将数据反映到 UI.

你的分机没用,因为它就像调用 API() 每次:

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

相同
API().callMethod()
API().callSecondMethod()

如果 API 是单例,idea 看起来不错,但在 swift 中你通常使用静态常量创建单例:

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

并仅在需要时将其连接到您的 viewController

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

通过这三种方式,您可以像这样访问 API:

apiHelper.callMethod()