Swift, 与方法名相同的变量
Swift, variable with same as a method name
我有一个:
var formVC:UIViewController!
我也在尝试将一个函数命名为:
func formVC()->UIViewController{....}
我知道它在 OBJC 中有效,但我在 Swift 中没有看到这样做的方法。有没有办法解决这个问题,或者我不理解 Swift 中明显的 architectural/conceptual 变化?
提前致谢。
这在 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 的 properties(即访问 ivar 的方法)。您无权访问 Swift.
中的基础 ivar
在Swift中,如果不传递参数,则不能将变量和函数命名为相同的名称。尽管我们以不同的方式调用它们(foo
用于变量,foo()
用于函数)我们将得到无效的 foo 重新声明。编译器将变量视为没有函数那样的参数。但是,使用参数,您可以将函数和变量命名为相同的名称,尽管我建议您不要这样做。在这种情况下,您应该尝试为变量和函数命名,以描述它们是什么 and/or 它们做了什么以使您的代码更容易被其他人阅读。我建议将变量命名为 formViewController
,将函数命名为 createFormViewController
。
var foo = 0
func foo() {} // Error: Invalid redeclaration of foo
func foo(string: String) {} // No error
如果您只使用函数来设置变量,请改用计算属性:
lazy var formViewController: UIViewController! {
return UIViewController()
}
我有一个:
var formVC:UIViewController!
我也在尝试将一个函数命名为:
func formVC()->UIViewController{....}
我知道它在 OBJC 中有效,但我在 Swift 中没有看到这样做的方法。有没有办法解决这个问题,或者我不理解 Swift 中明显的 architectural/conceptual 变化?
提前致谢。
这在 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 的 properties(即访问 ivar 的方法)。您无权访问 Swift.
中的基础 ivar在Swift中,如果不传递参数,则不能将变量和函数命名为相同的名称。尽管我们以不同的方式调用它们(foo
用于变量,foo()
用于函数)我们将得到无效的 foo 重新声明。编译器将变量视为没有函数那样的参数。但是,使用参数,您可以将函数和变量命名为相同的名称,尽管我建议您不要这样做。在这种情况下,您应该尝试为变量和函数命名,以描述它们是什么 and/or 它们做了什么以使您的代码更容易被其他人阅读。我建议将变量命名为 formViewController
,将函数命名为 createFormViewController
。
var foo = 0
func foo() {} // Error: Invalid redeclaration of foo
func foo(string: String) {} // No error
如果您只使用函数来设置变量,请改用计算属性:
lazy var formViewController: UIViewController! {
return UIViewController()
}