2016-04-15 6 views
2

Für mit komplexen Zahlen arbeiten, das ist, wie ich habe es getan:Swift Benutzerdefinierte Variablentyp

import Foundation 

class Complex { 
    var real: Float 
    var imaginary: Float 
    init(re: Float, im: Float) { 
     self.imaginary = im 
     self.real = re 
    } 
    func abs() -> Float { 
     return sqrtf(powf(self.real, 2) + powf(self.imaginary, 2)) 
    } 

    func string() -> String { 
     if (ceilf(self.real) == self.real) && (ceilf(self.imaginary) == self.imaginary){ 
      return "\(Int(self.real))+\(Int(self.imaginary))i" 
     } 
      return "\(self.real)+\(self.imaginary)i" 
    } 

    func arg() -> Float { 
      return atan2f(self.imaginary, self.real) 
    } 
} 

var someComplex = Complex(re: 2, im: 3) 
var someComplexString = someComplex.string() //"2+3i" 
var someComplexAbsolute = someComplex.abs() // 3.60... 
var someComplexArgument = someComplex.arg() //0.98... 

Nun ich habe mich gefragt, ob es eine Möglichkeit war eine benutzerdefinierte Variablentyp zu definieren, lassen würde ich schreibe es zum Beispiel als someComplex: Complex = 3i. Ist es möglich, einen neuen Typ "von Grund auf" zu erstellen?

+0

Was genau versuchen Sie zu tun? Wenn Sie nur irgendeinen Wert speichern möchten, können Sie 'Wert' als' AnyObject' oder 'Any' Typ definieren. – EmilioPelaez

+0

Auch Klassennamen beginnen per Konvention mit einem Großbuchstaben, zB 'SomeClass', und Variablen, auch in Initialisierern, beginnen mit einem Kleinbuchstaben, dh' init (stringValue: String) ' – EmilioPelaez

+0

Anstatt auf einen bereits vorhandenen Typ zuzugreifen a class (var a = someClass.someValue), weisen Sie dem Typ einen Wert direkt zu (var a = someClass) – Pixel

Antwort

1

können Sie verwenden ein typealias:

typealias Name = String 

Jetzt können Sie Name verwenden, wenn Sie sonst String verwenden:

func sayHello(to name: Name) { 
    print("Hello " + name) 
} 
+0

Danke, aber was ich meinte, war etwas wie ein benutzerdefinierter Typ, der alle floats und ich zum Beispiel akzeptieren würde. – Pixel

+0

@Pixel ein Typ, der alle Floats und Integer und alle anderen Typen akzeptieren kann? Vielleicht suchst du nach AnyObject oder Any? – Azuan

1

Ich bin etwas unsicher, ob dies ist, was Sie suchen , aber basierend auf Ihrem Kommentar zu der anderen Antwort

„Danke, aber was bedeuten, dass ich war so etwas wie ein benutzerdefinierter Typ, der alle Schwimmer und ich zum Beispiel annehmen würde“,

Sie einen Wrapper erstellen könntest, die einen einzelnen generischen Wert gilt, wobei den generischen Typen dieses Wertes ist Typ eingeschränkt zu einem Protokoll, zu dem Sie wiederum die Typen erweitern, die Sie Wrappable aber den Typ sein möchten. ZB unter Typen ermöglicht Int, Float und String zu der Sie

protocol MyGenericTypes { } 

extension Int: MyGenericTypes { } 
extension Float: MyGenericTypes { } 
extension String: MyGenericTypes { } 

struct SomeWrapper<T: MyGenericTypes> { 
    var value: T 
    init(_ value: T) { 
     self.value = value 
    } 
} 

let myInt = 42 
let myFloat: Float = 4.2 
let myString = "forty-two" 

let wrappedInt = SomeWrapper(myInt)  // T inferred as "Int" 
let wrappedFloat = SomeWrapper(myFloat) // T inferred as "Float" 
let wrappedString = SomeWrapper(myString) // T ingerred as "String" 

print(wrappedInt.dynamicType) // SomeWrapper<Int> 
print(wrappedFloat.dynamicType) // SomeWrapper<Float> 
print(wrappedString.dynamicType) // SomeWrapper<String> 

Umhüllung eingehüllt werden können generische Funktionen natürlich schreiben damit Argumente für SomeWrapper<T> Fälle Typ T in der gleichen Weise wie in der Struktur Definition oben

Zwang
func foo<T: MyGenericTypes>(bar: SomeWrapper<T>) ->() { 
    print(bar.value) 
} 

foo(wrappedInt) // 4.2 
foo(wrappedFloat) // 42 
foo(wrappedString) // forty-two