Swift使用协议扩展默认值

时间:2016-08-16 23:35:53

标签: swift protocols

我有

protocol ErrorContent {
  var descriptionLabelText: String { get set }
}
extension ErrorContent {
   var descriptionLabelText: String { return "Hi" }
}
struct LoginErrorContent: ErrorContent {
  var descriptionLabelText: String
  init(error: ApiError) {
     ...
  }
}

并且xcode抱怨"从初始化程序返回而不初始化所有存储的属性。"我想要的是只使用我在协议扩展中给出descriptionLabelText的默认值。这不是协议扩展的重点吗?无论如何,我想了解为什么这是错误的,以及如何使用我的默认值。

1 个答案:

答案 0 :(得分:3)

几乎正确,只是你的代码有几个问题:

  1. 您无需在 LoginErrorContent 中声明变量,因为该实现已经在 ErrorContent 扩展名中。再次声明它会覆盖扩展实现

  2. 如果要对 descriptionLabelText 使用扩展计算属性,则不能指定它是一个setter,因为它只返回一个值。

  3. 示例:

    protocol ErrorContent {
        var descriptionLabelText: String { get }
    }
    
    extension ErrorContent {
        var descriptionLabelText: String { return "Hi" }
    }
    
    struct LoginErrorContent: ErrorContent {
    
        // Overriding the extension behaviour
        var descriptionLabelText: String { return "Hello" }
    
        init(error: ApiError) {
            ...
        }
    }