2016-08-25 4 views
2

私は、プロトコルがParameterと呼ばれる持っている:あなたが見ることができるようにSwift Structのデフォルトイニシャライザを隠す方法はありますか?

struct Calcium: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Calcium", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Alkalinity: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Alkalinity", unit: Unit? = Unit(symbol: "ppm CaCO3"), value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Salinity: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Salinity", unit: Unit? = Unit(symbol: "SG"), value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Temperature: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Temperature", unit: Unit? = UnitTemperature.fahrenheit, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct PH: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "pH", unit: Unit? = nil, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Magnesium: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Magnesium", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Phosphate: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Phosphate", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Ammonia: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Ammonia", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Silica: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Silica", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Iodine: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Iodine", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Nitrate: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Nitrate", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Nitrite: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Nitrite", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Strontium: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Strontium", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct ORP: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "ORP", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

struct Boron: Parameter { 

    var name: String 
    var unit: Unit? 
    var value: Double 

    init(name: String = "Boron", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

    struct Iron: Parameter { 

     var name: String 
     var unit: Unit? 
     var value: Double 

     init(name: String = "Iron", unit: Unit? = UnitDispersion.partsPerMillion, value: Double) { 
      self.name = name 
      self.unit = unit 
      self.value = value 
     } 

    } 

は、構造体のすべてが同じ初期化子を実装:

protocol Parameter { 

    var name: String { get } 
    var unit: Unit? { get } 
    var value: Double { get } 

    init(name: String, unit: Unit?, value: Double) 

} 

私もParameterに準拠して16の構造体を持っています。初期化子では、私は私に、次の初期化子を与えParameterプロトコルによって必要な3つのパラメータの2のデフォルト値を提供します。

let calcium = Calcium(value: Double) 

私も構造体によって作成されたデフォルトの初期化子を取得:

let calcium = Calcium(name: String, unit: Unit?, value: Double) 

structのインスタンスを作成するときに、両方の初期化子がXcodeのコード補完ポップアップに表示されます。しかし、nameunitのパラメータは、イニシャライザで提供されているデフォルト値と異なるものにすることはできません。私はまたnameunitプロパティのデフォルト値を代入しようとしましたが、それは構造体内で宣言されていますが、Parameterプロトコルで必要とされる初期化子の外で宣言されています。

のXcodeのコード補完ポップアップのデフォルトの初期化子のショーを持っていない一方で、nameunitパラメータのデフォルト値を提供するだけで提供されるvalueパラメータを要求することにより、構造体を初期化する方法はありますか?

Xcodeのコード補完ポップアップで初期化子が両方とも表示されることがあるのは、Parameterプロトコルで必要とされるイニシャライザで提供しているもの以外の構造体を作成して値を提供したくないということだけです。 。

私はクラスでこれを行うことができることを認識していますが、プロトコル指向のプログラミングと構造体を使用して私の心を正しく取り戻そうとしています。それを行うには

答えて

0

一つの方法:

我々はoptionalsにすべての変数を変更し、プロトコルからのデフォルトパラメータで初期化子を削除しました。 unitvalueのデフォルト値がの場合、常にになるため、クライアントがこの初期化子を表示する必要はありません。このように見て

protocol Parameter { 
    var name: String? { get } 
    var unit: Unit? { get } 
    var value: Double? { get } 
    //init(name: String, unit: Unit?, value: Double) 
    init(value: Double) 
} 

と変更構造:構造自体に

struct Calcium: Parameter { 

    var name: String? = nil 
    var unit: Unit? = nil 
    var value: Double? = nil 

    init(value: Double) { 
     self.init(name: "Calcium", unit: UnitDispersion.partsPerMillion, value: value) 
    } 

    private init(name: String, unit: Unit, value: Double) { 
     self.name = name 
     self.unit = unit 
     self.value = value 
    } 

} 

、我々は一つのパラメータのみを必要とするカスタム初期化子から呼び出されたプライベート初期化子を、追加しています。

Xcodeの補完ポップアップには初期化子が1つしかありません。 image

関連する問題