标签: failable

Swift:"failable initializer'init()'不能覆盖不可用的初始化程序"与默认参数

如果我宣布

public class A: NSObject {
    public class X { }
    public init?(x: X? = nil) { }
}
Run Code Online (Sandbox Code Playgroud)

一切都很好.使用它时let a = A(),初始化程序按预期调用.

现在,我想让嵌套类成为X私有,并且参数化init也是如此(当然必须是).但是一个简单的init?()应该像以前一样公开.所以我写

public class B: NSObject {
    private class X { }
    private init?(x: X?) { }
    public convenience override init?() { self.init(x: nil) }
}
Run Code Online (Sandbox Code Playgroud)

但是这会给init?()初始化程序带来错误:可用的初始化程序'init()'不能覆盖不可用的初始化程序,并且覆盖的初始化程序为public init()in NSObject.

为什么我可以有效地声明一个A.init?()没有冲突的初始化器但不是B.init?()

奖金问题:为什么我不允许使用可用的初始化程序覆盖不可用的初始化程序?相反的是合法的:我可以使用不可用的覆盖可用的初始化程序,这需要使用强制super.init()!,因此引入了运行时错误的风险.对我来说,让子类具有可用的初始化器感觉更加明智,因为功能的扩展会带来更多的失败机会.但也许我在这里遗漏了一些东西 - 解释非常感谢.

initializer swift failable

9
推荐指数
2
解决办法
5020
查看次数

结果类型的初始值设定项失败?

我有一个结构MyStruct。它可以从字符串初始化,但是有很多方法会导致字符串无效。我不想简单地创建一个在所有失败情况下init?(string: String)返回相同的可失败初始化程序nil,而是希望有一个返回 Result 类型的初始化程序,Result<MyStruct, Error>以便调用方法可以知道发生了哪种失败情况并报告信息性错误。

我可以写一个方法static func makeNew(string: String) -> Result<Self, Error>。这样就不用打电话了

guard let new = MyStruct(string: someString) else {
   print("\(someString) was invalid somehow.")
}
print("Object created.)
Run Code Online (Sandbox Code Playgroud)

我可以makeNew这样调用:

switch MyStruct.makeNew(string: someString) {
case .success(let new):
   print("Object created")
case .failure(let error):
   switch error {
      // handle each specific error appropriately
   }
}
Run Code Online (Sandbox Code Playgroud)

这是唯一的方法,还是 Swift 给了我们一个实际的初始化器来做到这一点?

initializer resulttype swift failable

1
推荐指数
1
解决办法
55
查看次数

标签 统计

failable ×2

initializer ×2

swift ×2

resulttype ×1