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()
我希望避免在每个 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()