【问题标题】:Specify global scope in Swift在 Swift 中指定全局范围
【发布时间】:2016-04-07 00:27:25
【问题描述】:

你能在 Swift 中指定全局/模块命名空间吗?

这段代码:

func foo(i: Int) { print("global foo", i) }

class Bar {
  func foo() { foo(5) }
}

导致错误Argument passed to call that takes no arguments。我在别处看到它说MyProject.foo(5)Swift.foo(5)MyModule.foo(5) 可能有效,但在Swift 2.1.1 中它们似乎没有。

编辑:听起来MyProject.foo(5) 对其他人有用。有人知道为什么它可能不在我的项目中吗?

【问题讨论】:

  • 很好奇。为什么你应该能够将 5 传递给不带参数的函数?
  • 全局范围内的函数是接受参数的函数。你听起来就像编译器。
  • 当我查看它时,出于某种原因,我没有看到带参数的 foo()。但现在我知道了。
  • 这至少比编译器错误更容易解决!

标签: swift scope namespaces


【解决方案1】:

是的,您可以使用您的项目名称,例如“MyProject”,然后您可以这样调用全局函数:

class Bar {
  func foo() { MyProject.foo(5) }
}

但我建议将您的全局函数保留在这样的类中:

class GlobalFunctions {
   static func foo(i: Int) { print("global foo", i) }
}

class Bar {
  func foo() { GlobalFunctions.foo(5) }
} 

这样,您的代码更具可读性。

【讨论】:

  • 我提到我在问题中尝试过这个。但是我的项目一定有什么特别的问题。
  • @Grumdrig 您使用的是哪个 Xcode?也许你应该安装最新的!
  • 7.2,我假设它是最新的?至少 App Store 不关心更新它。
【解决方案2】:

是的。您可以通过在符号名称前面加上项目名称来指定全局范围,如 Xcode 中所示。例如,如果您的项目名称是“myapp”,那么您可以将全局函数 foo(_:Int) 调用为 myapp.foo(5)

【讨论】:

  • 您的问题表明您尝试使用项目名称但仍然无法正常工作,但在 Xcode 7.2 和 Swift 2.1.1 中尝试时没有问题。抱歉,我不知道问题的原因可能是什么。
  • 我做到了。我想它一定是特定于我的设置的。我无法想象是什么。
【解决方案3】:

哦。问题是我有一个与我的项目同名的类,所以MyProject.foo 解析为类名而不是全局范围。

我不知道是否有比let 全局范围内的全局函数别名更好的解决方法,或者@Kiet Nguyen 建议将全局变量移到命名空间中。但至少这可以解释。

【讨论】:

    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2014-02-22
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多