2017-07-06 6 views
0

Je voudrais être capable de sous-classer Double avec quelques types personnalisés dans mon code swift afin de pouvoir faire de l'introspection et de la surcharge de l'opérateur plus tard.Sous-classe Swift Double/Surcharge de l'opérateur typealias

C'est sémantiquement ce que je veux être en mesure d'écrire:

class Frequency: Double {} 

class Period: Double { 
    init(_ frequency: Frequency) { 
     let period: Double = 1/frequency 
     self.init(period) 
    } 
} 


let a = Double(1) 
print(type(of: a)) // Double 

let b = Frequency(2) 
print(type(of: b)) // Frequency 

let c = Period(a) 
print(type(of: c)) // Period == 1 

let d = Period(b) 
print(type(of: d)) // Period == 0.5 

Sentez-vous comme ce que je suis en train de faire devrait être que Swift est posible un langage strictement typé.

J'ai également examiné les typealias, mais vous ne pouvez pas surcharger l'opérateur avec ceux-ci. J'ai également regardé le protocole FloatingPoint mais ne semble pas m'aider.

+1

'Double' est un struct et il ne peut pas être prolongé. – rmaddy

+0

@rmaddy malheureusement pas. Je me demandais s'il y avait une approche différente. Peut-être des protocoles? – freebie

Répondre

0

alors que ce n'est pas possible, j'ai créé une classe il y a un certain temps, qui traitait un problème similaire. J'avais besoin d'une classe variable polyvalente, pour la facilité de synthax dans les chaînes monétaires, et je me suis retrouvé avec quelque chose comme ci-dessous. Jusqu'à présent, ça fonctionne très bien, et je l'utilise comme mortier pour de nombreuses sous-classes avancées que j'ai construites depuis. Il fait ce que vous voulez, ce qui si vous pouvez voir dans la sous-classe de fréquence, devient une question de peaufiner le remplacement init pour chaque cas d'utilisation. Alors que la classe est grande, et les méthodes encombrantes, n'hésitez pas à modifier et modifier comme bon vous semble, ou si vous trouvez des approches plus simples. Je l'ai téléchargé dans un fichier Gist ici afin qu'il puisse être lu facilement.

Link to the class.

Lorsqu'il est utilisé avec votre cas d'utilisation, il permet de ce qui suit, ce qui semble être ce que vous voulez:

class Frequency : MultiVar { 
    override init(_ value: Any?) { 
     super.init(value) 
     let current = double 
     guard current != 0.0 else { 
      print("Frequency Error: Something went wrong while subclassing \(self), established variable 'double' is equal to 0!") 
      return 
     } 
     double = 1/current 
    } 
} 

let freq = Frequency(10) 
print(freq.string) //prints 0.1 
print(freq.double) //prints 0.1