Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用函数还是类型方法?_Ios_Swift - Fatal编程技术网

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上工作。