2016-08-25 2 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) 구조체가 있습니다.

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

let calcium = Calcium(value: Double) 

나는 또한 구조체에 의해 생성 된 기본 초기화를 얻을 : 이니셜 라이저에서는, 나는 나에게 다음과 같은 이니셜을주는 Parameter 프로토콜을 필요로하는 세 개의 매개 변수의 두 가지에 대한 기본 값을 제공

struct의 인스턴스를 만들 때 두 초기화 코드가 모두 Xcode의 코드 완료 팝업에 나타납니다. 그러나 nameunit 매개 변수가 이니셜 라이저에 제공된 기본값과 다른 값이 될 수 없도록하려고합니다. 또한 nameunit 속성의 기본값을 할당하려고 시도했으나 구조체 내부에서 선언되었지만 Parameter 프로토콜에 필요한 이니셜 라이저 외부에서는 선언되었습니다.

엑스 코드의 코드 완성 팝업의 기본 초기화 쇼를 가지고 있지 동안의 nameunit 매개 변수에 대한 기본값을 제공하는 경우에만 제공 할 value 매개 변수를 필요로하여 구조체를 초기화하는 방법이 있나요?

Xcode의 코드 완성 팝업에 두 초기화 코드가 모두 나타나는 것은 내가 다른 사람이 구조체를 만들고, Parameter 프로토콜에 필요한 이니셜 라이저에서 제공 한 것 이외의 값을 제공하는 것을 원하지 않는다는 것뿐입니다. .

나는 수업에서 그렇게 할 수 있다는 것을 알고 있지만 프로토콜 지향 프로그래밍과 구조체를 사용하여 내 마음을 올바르게 얻으려고 노력하고있다. 그것을 할 수

답변

0

한 가지 방법 :

우리는 선택적 항목에 모든 변수를 변경하고, 프로토콜에서 기본 파라미터 초기화를 제거. 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 완료 팝업에서 초기화 자 하나만 있습니다. image