2016-08-16 16 views
1

私はスウィフト、使用プロトコルの拡張デフォルト

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に与えたデフォルト値を使用します。それはプロトコルの拡張のポイントではありませんか?とにかく、これがなぜ間違っているのか、私のデフォルト値を使うためにできることを理解したいと思います。

答えて

2

ほぼ正しい、あなたのコードの問題だけのカップル:

  1. あなたは実装がErrorContent拡張にすでにあるように、LoginErrorContentで変数を宣言する必要はありません。再びそれを宣言すると、あなたはdescriptionLabelText用拡張計算プロパティを使用したい場合は、それが唯一の値を返すように、あなたは、それがセッターであることを指定することはできません拡張機能の実装に

  2. を上書きします。

例:

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) { 
     ... 
    } 
} 
+0

感謝。 descriptionLabelTextを条件付きでオーバーライドする場合はどうすればよいですか? – natecraft1

+0

私は、拡張モジュールの実装をオーバーライドする方法を示すために私の例を編集しました。異なる戻り値を持つ構造体に同じ実装を追加しました。 – Yasir

+0

は条件付きでオーバーライドする手段ですか? @ Yasir – natecraft1

関連する問題