为什么我不能在Swift中将局部类变量传递给新实例化的类?

时间:2019-11-24 08:59:09

标签: swift

我有一个如下的类,其中包含baseUrlapollo

class ViewController: UIViewController {

  private let baseUrl = "http://myserver.org:4000"
  private let apollo = ApolloClient(url: URL(string: "http://myserver.org:4000")!)

}

请注意,http://myserver.org:4000已在两者之间共享,所以我想共享它们

我都尝试过

private let apollo = ApolloClient(url: URL(string: baseUrl)!)
// This error out stating 
// `Cannot use instance member 'baseUrl' within property initializer; 
// property initializers run before 'self' is available`

private let apollo = ApolloClient(url: URL(string: self.baseUrl)!)
// This error out stating 
// `Value of type '(ViewController) -> () -> ViewController' has no member 'baseUrl'`

我如何让他们分享?我认为用一种语言将常量传递给另一个类很简单。 (对不起,如果这很简单,我对Swift不太熟悉。因为我是更多Android开发人员。)

2 个答案:

答案 0 :(得分:1)

您可以将baseUrl设为静态:

private static let baseUrl = "http://myserver.org:4000"
private let apollo = ApolloClient(url: URL(string: ViewController.baseUrl)!)

错误消息说self不能完全初始化之前不能使用实例成员,如果考虑一下,这是很公平的,所以我们将其设为静态。

或者,在初始化程序中执行此操作:

private let baseUrl : String = "http://myserver.org:4000"
private let apollo: ApolloClient

required init?(coder: NSCoder) {
    apollo = ApolloClient(url: URL(string: baseUrl)!)
    super.init(coder: coder)
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    apollo = ApolloClient(url: URL(string: baseUrl)!)
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
  

为什么不能直接使用baseUrl

这是here的简要说明:

  

如果使用闭包来初始化属性,请记住在执行闭包时实例的其余部分尚未初始化。这意味着您无法从闭包内部访问任何其他属性值,即使这些属性具有默认值也是如此。您也不能使用隐式self属性,也不能调用实例的任何方法。

尽管您在这里并没有真正使用闭包,但是想法是一样的。原因仍然适用。请注意,这与Java不同,在Java中,字段是按文本顺序初始化的,使得这样的事情成为可能:

private int a = 1;
private int b = a + 1;
private int c = b + 2;

但是在Swift中,没有指定初始化属性的顺序。

答案 1 :(得分:1)

根据初始化规则,不允许初始化相互依赖的常量属性。

或者延迟apollo初始化,这意味着该实例是在首次访问时创建的

class ViewController: UIViewController {
    private let baseUrl = URL(string:"http://myserver.org:4000")!
    private lazy var apollo = ApolloClient(url: baseUrl)    
}

var个变量可以延迟初始化,但是由于该变量是私有变量,因此无关紧要。