2016-05-31 5 views
2

Ich würde gerne Double mit einer benutzerdefinierten Konvertierung zu String erweitern können, aber ich möchte dies nur auf Implementierungen mit Klassen/Strukturen beschränken. FürErweitern Sie Double nur innerhalb meiner Struktur

extension Double { 
    var customStringOutput: String { 
    guard self >= 0.0 else { return "Invalid" } 
    return "My number is: \(self)" 
    } 
} 

struct MyStruct { 
    var myNumber: Double = 100.0 
} 

let myStruct = MyStruct() 
let doubleFail = 99.0 
print(myStruct.myNumber.customStringOutput) //"My number is: 100.0" 
print(doubleFail.customStringOutput)   //"My number is :99.0" - Should fail 

Ich habe versucht, ein Protokoll wie zu erstellen:

protocol DoubleCustomStringConvertable { ... } 

Anwendung, das zu Double erzeugt das gleiche Ergebnis wie gerade verlaufende Doppel direkt. Ich kann eine Funktion innerhalb meiner Struktur schaffen, die das Doppelte als Parameter nimmt und meine Zeichenkette zurückgibt, die technisch mein Problem lösen würde, aber dieses ist eher eine lernende Übung und ich mag die sauberere Syntax der Eigenschaft.

Wie kann ich das Protokoll nur auf Double innerhalb meiner definierten Struktur anwenden? Das ist wahrscheinlich so einfach, ich werde mich selbst treten!

+0

Haben Sie eine private Erweiterung auf Double in Betracht gezogen? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID25 – JAL

Antwort

1

Machen Sie es nicht zu einem Protokoll, sondern nur zu einer Funktion, die in Ihrer Struktur definiert ist. Es gibt keine Möglichkeit, den Umfang eines Protokolls (auf alle Double s innerhalb eines Werttyps wie MyStruct) zu beschränken.

+0

Wie ich schon sagte, ich könnte das tun, aber dann dupliziere ich Code in den verschiedenen Strukturen, die diese Definition benötigen. Ich könnte die Funktion in ein Protokoll einfügen und auf die Strukturen anwenden, die sie benötigen, aber ich mag auch die Syntax von double.parameter anstatt func (double) - obwohl sie funktional äquivalent sein können. (Code-Vervollständigung), Beschränkung auf bestimmte Doubles, etc ... – DJohnson