Swift,变量与方法名称相同

问题描述 投票:8回答:2

我有一个 :

var formVC:UIViewController!

我也想尝试一个名为的函数:

func formVC()->UIViewController{....}

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

提前致谢。

function swift design-patterns syntax uiviewcontroller
2个回答
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。


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()
}
© www.soinside.com 2019 - 2024. All rights reserved.