Swift,变量与方法名称相同

时间:2015-03-12 17:33:03

标签: function swift design-patterns syntax uiviewcontroller

我有一个:

var formVC:UIViewController!

我还尝试使用名为

的函数
func formVC()->UIViewController{....}

我知道在OBJC中它有用,但我没有在Swift中看到这样做的方法。有没有办法解决这个问题,或者我不理解Swift中明显的架构/概念变化?

提前致谢。

2 个答案:

答案 0 :(得分:10)

这在ObjC中是一个坏主意,在Swift中它是非法的。考虑其中一些情况:

class X {
    var value : Int = 0
    func value() -> Int { return 1 }
}
let x = X()

在这种情况下,x.value是什么?它是Int还是() -> Int?将类的方法视为闭包是合法且有用的。

如果我们变得更加棘手,那该怎么办呢?

class X {
    let value: () -> Int = { 2 }
    func value() -> Int { return 1 }
}
let x = X()
let v = x.value() // ????

Swift应该使用属性value然后调用它吗?或者它应该调用方法value()?闭包是完全合法的属性。

ObjC实际存在同样的限制。您无法创建与方法冲突的合成属性(如果它们具有不同的类型;如果它们具有相同的类型,则ObjC将默默地不合成访问器)。您正在考虑Swift属性,因为它们等同于ObjC的ivars,但那不对。 Swift的属性等同于ObjC的属性(即访问ivars的方法)。您无法访问Swift中的基础ivars。

答案 1 :(得分:2)

在Swift中,如果没有传递参数,则不能将变量和函数命名为相同的东西。虽然我们以不同的方式调用它们(foo表示变量而foo()表示函数),但我们将无法重新声明foo。编译器将变量视为没有像函数那样的参数。但是,使用参数,你可以命名一个函数和一个变量同样的东西,虽然我建议你不要。在这种情况下,您应该尝试将变量和函数命名为描述它们是什么和/或它们如何使您的代码更易被其他人读取。我建议将变量命名为formViewController,函数类似createFormViewController

var foo = 0

func foo() {} // Error: Invalid redeclaration of foo

func foo(string: String) {} // No error

如果您只使用函数来设置变量,请改用计算属性:

lazy var formViewController: UIViewController! {
    return UIViewController()
}