Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Swift中扩展和静态辅助函数的区别_Swift - Fatal编程技术网

Swift中扩展和静态辅助函数的区别

Swift中扩展和静态辅助函数的区别,swift,Swift,我正在为我的Swift项目编写一些帮助函数。我不确定这两种方法的优缺点: // use extension: extension SKAction { public static func blink( count: Int, outDuration: TimeInterval, inDuration: TimeInterval, chillDuration: TimeInterval) -> SKAction { var action

我正在为我的Swift项目编写一些帮助函数。我不确定这两种方法的优缺点:


// use extension: 

extension SKAction {
  public static func blink(
    count: Int,
    outDuration: TimeInterval,
    inDuration: TimeInterval,
    chillDuration: TimeInterval) -> SKAction
  {
    var actions = [SKAction]()
    for i in 0..<count {
      let fadeOut = SKAction.fadeOut(withDuration: outDuration)
      let fadeIn = SKAction.fadeIn(withDuration: inDuration)
      actions += [fadeOut, fadeIn]
      if chillDuration > 0 {
        let wait = SKAction.wait(forDuration: chillDuration)
        actions += [wait]
      }
    }
    return SKAction.sequence(actions)
  }
}

// use static util
public final class SKAnimationUtil {

  public static func createBlinkAnimation(
    count: Int,
    outDuration: TimeInterval,
    inDuration: TimeInterval,
    chillDuration: TimeInterval) -> SKAction
  {
    var actions = [SKAction]()
    for i in 0..<count {
      let fadeOut = SKAction.fadeOut(withDuration: outDuration)
      let fadeIn = SKAction.fadeIn(withDuration: inDuration)
      actions += [fadeOut, fadeIn]
      if chillDuration > 0 {
        let wait = SKAction.wait(forDuration: chillDuration)
        actions += [wait]
      }
    }
    return SKAction.sequence(actions)
  }
}

//使用扩展名:
扩展动作{
公共静态函数(
计数:Int,
超时:时间间隔,
硬化:时间间隔,
持续时间:时间间隔)->SKAction
{
var actions=[SKAction]()
因为我在0..0{
let wait=SKAction.wait(持续时间:0)
操作+=[等待]
}
}
返回SKAction.sequence(操作)
}
}
//使用静态util
公共最终类SKAnimationUtil{
公共静态函数创建动画(
计数:Int,
超时:时间间隔,
硬化:时间间隔,
持续时间:时间间隔)->SKAction
{
var actions=[SKAction]()
因为我在0..0{
let wait=SKAction.wait(持续时间:0)
操作+=[等待]
}
}
返回SKAction.sequence(操作)
}
}

静态util是我以前通常做的。但是后来我发现SKAction已经带有很多工厂函数(例如,
SKAction.fadeIn(withDuration:)
)。

首先,声明名称以SK开头的类是非法的。类型名称上的两个大写字母前缀是为Apple保留的!我喜欢从
My
开始做每件事来绕开这条规则

好的,接下来是一个实际问题:两者之间绝对没有显著差异

extension SKAction {
    public static func blink(

这些是静态方法,因此它们实际上是全局的,将它们包装到类型(SKAction或您的实用程序类)中的唯一原因是以一种好的方式命名它们。(静态方法没有使用任何关于其周围类的内容。)“nice”的概念完全是主观的,因此任何进一步的区别都将是意见的问题

然而,说到这里,我只想说我个人所做的就像第一个例子。此方法“应该”属于哪个命名空间?正如你所说的,这是一个SKAction工厂,所以它可以很好地在SKAction中运行。没有理由仅仅为了保存这个方法而添加到现有的类库中

特别要考虑的是,创建类的唯一原因是为了实例化该类。但你永远不会制作一个SKAnimationUtil实例,所以光是Occam的剃须刀就足以让人叫骂。这不是经典意义上的助手


最后,我要补充的是,静态方法的名称空间“持有者”最好使用Swift,使用结构或枚举(现在更好)。一个类,甚至是最后一个类,对于作业来说开销太大。

首先,声明名称以SK开头的类是非法的。类型名称上的两个大写字母前缀是为Apple保留的!我喜欢从
My
开始做每件事来绕开这条规则

好的,接下来是一个实际问题:两者之间绝对没有显著差异

extension SKAction {
    public static func blink(

这些是静态方法,因此它们实际上是全局的,将它们包装到类型(SKAction或您的实用程序类)中的唯一原因是以一种好的方式命名它们。(静态方法没有使用任何关于其周围类的内容。)“nice”的概念完全是主观的,因此任何进一步的区别都将是意见的问题

然而,说到这里,我只想说我个人所做的就像第一个例子。此方法“应该”属于哪个命名空间?正如你所说的,这是一个SKAction工厂,所以它可以很好地在SKAction中运行。没有理由仅仅为了保存这个方法而添加到现有的类库中

特别要考虑的是,创建类的唯一原因是为了实例化该类。但你永远不会制作一个SKAnimationUtil实例,所以光是Occam的剃须刀就足以让人叫骂。这不是经典意义上的助手


最后,我要补充的是,静态方法的名称空间“持有者”最好使用Swift,使用结构或枚举(现在更好)。一个类,甚至是最后一个类,对于这项工作来说,开销太大了。

如果您从未创建该类的实例
SKAnimationUtil
,最好使用枚举,并在其上使用静态方法,但如果您可以创建该类的实例,请将其保留为类。至于它是否应该是一个扩展,您是否在函数调用中访问
self
,如果不是,那么它就不需要是一个扩展?@Andrew nope,我从来没有为此创建过实例。但你觉得把它变成“枚举”有什么奇怪吗?因为在我看来,枚举代表不同的情况。你可以用枚举来表示名称间距。你甚至不需要创建案例。查看以下链接:如果您从未创建类的实例
SKAnimationUtil
,最好使用枚举,并在其上使用静态方法,但如果您可以创建它的实例,请将其保留为类。至于它是否应该是一个扩展,您是否在函数调用中访问
self
,如果不是,那么它就不需要是一个扩展?@Andrew nope,我从来没有为此创建过实例。但你觉得把它变成“枚举”有什么奇怪吗?因为在我看来,枚举代表不同的情况。你可以用枚举来表示名称间距。你甚至不需要创建案例。查看这些链接:现在将静态util函数放在“Enum”中是一种惯例吗?还是反模式?在我看来,enum代表不同的情况。在其他语言(如java)中,我总是看到用来保存util函数的类。这不是另一种语言。它很快。Java没有任何不是类的类型。斯威夫特做到了。“每件事都只是它的本来面目,而不是其他任何东西。”至于你关于为此目的使用enum的问题,这是苹果目前的偏好,我喜欢跟随他们。一个枚举,没有大小写,只有静态m