Ios 使用函数还是类型方法?
我想创建一个Ios 使用函数还是类型方法?,ios,swift,Ios,Swift,我想创建一个Helper.swift文件,以添加一些在我的应用程序的不同部分中有用的函数/方法 我想知道什么是最佳实践(如果有的话):创建一个类,只创建类型方法还是只创建函数?解决方案#1: class Helper { class func classMethod() { // TODO: play something } } struct Helper { static func classMethod() { // TODO: d
Helper.swift
文件,以添加一些在我的应用程序的不同部分中有用的函数/方法
我想知道什么是最佳实践(如果有的话):创建一个类,只创建类型方法还是只创建函数?解决方案#1:
class Helper {
class func classMethod() {
// TODO: play something
}
}
struct Helper {
static func classMethod() {
// TODO: do something
}
}
并称之为:
Helper.classMethod()
在Apple文档中:
结构在代码中传递时总是被复制的,并且不使用引用计数
解决方案#2:
class Helper {
class func classMethod() {
// TODO: play something
}
}
struct Helper {
static func classMethod() {
// TODO: do something
}
}
并使用它:
Helper.classMethod()
我认为解决方案2比解决方案1好,因为它不会增加引用计数
更新:我用操场进行了测试。请参见下面的结果:
希望这有帮助 我通常倾向于在适当命名的类型上使用类型方法,以便为助手方法提供上下文并避免污染全局命名空间
在Swift中,结构是此类结构的理想候选:
struct Helper {
static func helpfulMethod() { ... }
}
我还在顶级类型中大量使用带有静态常量的嵌入式结构,以便在代码中对相关常量进行分组
<>在编写自定义SWIFT类型时,应首先考虑使用结构,只在继承时使用类,引用语义(与隐式语义值复制相反)或所有权语义(<代码>未拥有的< /代码> /<代码>弱< /代码>)是必需的。在这种情况下,您的实用程序函数将是无状态的,并且没有继承,因此结构应该比类更受欢迎
我认为,一般来说,Swift语言正在从全局函数转向由类型(和协议/泛型)提供的隐式名称空间。但这在很大程度上仍然是一个风格/个人偏好的问题,对于像效用函数这样简单的东西来说,它没有什么影响。我不知道这是否是最佳实践,但下面是我如何做到的
首先,我声明一个协议:
protocol UtilityType { }
然后扩展它(例如UIViewController的实用函数)
我是这样用的
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setDefaultTitleAttributes()
}
}
extension MyViewController: UtilityType {}
不需要创建类或结构。您只需将函数直接放入Helper.swift文件中即可。您甚至不需要通过编写导入语句来导入此文件
要测试它,请创建一个名为helper.swift的文件,并向该文件中添加以下代码行不需要类或结构。
import Foundation
func addTwo(x: Int) {
return x+2
}
要在任何其他文件中使用此函数,只需使用所需参数调用该函数
let a = addTwo(9)
我更喜欢这种方法,因为当你调用函数时,你不必在类/结构的实例上调用它。其次,它使代码更简洁,因为您不必将每个函数都设置为类函数或静态函数。我更喜欢类型方法,因为通过这种方式,您可以轻松区分方法
假设您有50到60个方法,其中有些方法用于设计,有些方法用于计算,有些方法用于在服务器上获取和发布数据
现在在这个场景中,如果你在全球范围内创建所有这些方法,它将变得难以识别和记住
现在,如果您在某些类/结构中区分这些方法,如下所示:
- 用于设计目的的方法生成一个
DesignHelper
class/struct,并将所有这些方法作为class/static方法
- 用于计算目的的方法生成一个
MathHelper
class/struct,并将所有这些方法作为class/static方法
- 与服务器一起用于处理数据的方法创建一个
ConnectionHelper
class/struct,并将所有这些方法作为class/static方法
通过使用这种方法,您可以轻松找到任何方法,它也将有助于自动完成
谢谢。通过一个类对函数进行分类,但通常,在整个应用程序中使用的那些函数将重新出现在相同的对象上。更简洁的方法是在将使用函数的对象的扩展中定义函数。您可以将所有扩展都放在Helper.swift中
e、 g
像这样使用page.backgroundColor=UIColor.randomColor()
因此,您仍然可以根据用途将函数定义为类函数或对象函数,但要在对象的扩展范围内
这可以保持代码的清晰性,这样就不会在整个代码库中通过helper路由调用。它为需要该功能的对象明确定义。如果您发现在扩展函数中没有意义的代码,那么该函数可能需要重构为更专注于功能的代码 我认为您应该使用as class function.ok,但是在什么方面它比仅仅使用func classMethod(){//TODO:play something}
?使用helper方法创建实例方法
真的不是必需的。我认为@Nico意识到这是一个选项,但希望讨论每种方法的优点(全局函数与类型方法)。这并不是要从你的最后一段中删除,但是,在那里你确实讨论了这种方法的好处:)@Stuart I只是添加了这个答案来指出这也是一种可能性。这种方法的好处是更少的代码。是的,这就是我用一些常量所做的。写起来确实更快,在创建它们的文件中可能更清晰,但我同意@Stuart的答案,因为它提供了一个上下文。我实际上意识到,当我不记得方法/常量的名称时,它可能会对我有所帮助,但如果我没有错的话,协议的上下文(或在本例中的类)扩展只在Swift 2上工作。