我有一个如下的类,其中包含baseUrl
和apollo
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开发人员。)
答案 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
个变量可以延迟初始化,但是由于该变量是私有变量,因此无关紧要。