我有一个:
var formVC:UIViewController!
我还尝试使用名为
的函数func formVC()->UIViewController{....}
我知道在OBJC中它有用,但我没有在Swift中看到这样做的方法。有没有办法解决这个问题,或者我不理解Swift中明显的架构/概念变化?
提前致谢。
答案 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()
}