Generic Type für eine Property

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Generic Type für eine Property

    Hallo zusammen,

    gemäß dem Motto "Schreib Deinen Code nur einmal" würde ich gerne folgende Klasse erstellen:

    Quellcode

    1. class Delay : Codable, Equatable {
    2. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    3. // S T A T I C C O N S T A N T S
    4. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    5. /// The value that represents that the delay is deactivated.
    6. static let none : Int = 1977
    7. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    8. /// The lower limit for the delay.
    9. static let min : Int = 0
    10. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    11. /// The upper limit for the delay.
    12. static let max : Int = 300
    13. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    14. // I N S T A N C E P R O P E R T I E S
    15. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    16. /// The parent to wiche the depay belongs.
    17. unowned var parent : Configuration?
    18. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    19. /// The number of seconds for the delay.
    20. @Published var value : Int {
    21. didSet {
    22. if(self.value != Delay.none) {
    23. if(self.value < Delay.min) {
    24. self.value = Delay.min
    25. } else if(self.value > Delay.max) {
    26. self.value = Delay.max
    27. }
    28. }
    29. if let _configuration = self.parent {
    30. _configuration.setUserDefaults()
    31. }
    32. }
    33. }
    34. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    35. // I N I T I L I Z E R
    36. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    37. /// Creates a new instance from Swift objects.
    38. ///
    39. /// - Parameter value: The time in seconds for the delay.
    40. init(_ _value : Int) {
    41. if(_value != Delay.none) {
    42. self.value = Swift.min(Swift.max(_value, Delay.min), Delay.max)
    43. } else {
    44. self.value = Delay.none
    45. }
    46. }
    47. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    48. // C O D A B L E
    49. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    50. convenience required init(from _decoder: Decoder) {
    51. try! self.init(_decoder.singleValueContainer().decode(Int.self))
    52. }
    53. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    54. func encode(to _encoder : Encoder) {
    55. var _container : SingleValueEncodingContainer = _encoder.singleValueContainer()
    56. try! _container.encode(self.value)
    57. }
    58. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    59. // E Q U A T A B L E
    60. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    61. static func == (_lhs : Delay, _rhs : Delay) -> Bool {
    62. return(_lhs.value == _rhs.value)
    63. }
    64. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    65. static func != (_lhs : Delay, _rhs : Delay) -> Bool {
    66. return !(_lhs == _rhs)
    67. }
    68. }
    69. // ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    70. // END OF FILE
    Alles anzeigen
    Mein Problem ist die Property parent die momentan als Optional Configuration definiert ist.
    Eigentlich muss Configuration generisch sein, da je nach dem wo die Klasse Delay verwendet wird, müssen unterschiedliche UserDefaults gespeichert werden.

    Das einzige was mir einfällt ist die Klasse Delay abzuleiten in PrivacyDelay und AccessProtectionDelay (Privacy und AccessProtection sind die beiden Klassen die anstatt Configuration verwendet werden müssten).
    In Delay wurde ich dann eine leere Funktion setUserDefault erstellen, die ich in den beiden Ableitungen überschreiben müsste.

    Insgesamt brauche diese Klasse aktuell 5x. Rentiert sich dann der Aufwand überhaupt?

    Fällt Euch noch etwas besseres ein?
  • Ich bin ja kein Hardcore-Swift-Programmierer, da ich viel zu wenig in Swift programmiere, aber deine Delay-Klasse könnte man auch mit einem Enum oder so machen. Aber ich bin mir nicht sicher, welche Vorteile oder Nachteile das jetzt konkret haben könnte. Mir gefällt die Definition von den "None" halt nicht...

    Wenn Du immer nur setUserDefaults() von der Configuration aufrufst, dann kannst Du die Methode in ein Prototocol packen. Dann wäre "Parent" ein Objekt, das dieses Protokoll unterstützt, oder halt undefiniert.
  • Das mit dem Enum hatte ich mir auch schon überlegt, dass nimmt mir aber die jetzige Flexibilität.
    Wenn ich feststelle 300 ist zu wenig, brauch ich nur max auf z.B. setzen und das wars.
    Das Ganze verwende ich um z.B. nach den eingestellten Delay die App zu sperren.
    Die Konstante none rührt daher, weil nicht keinen zusätzlichen Bool für aktiv/inaktiv führen wollte.
  • Scheiße Leute seit Ihr geil.
    Das war genau das, was ich brauchte.
    Ich habe nicht gecheckt, das ich bei der Variablendeklaration nicht nur auf Class und Struct sondern auch auf Protocol verweisen kann.
    Herzlichen Dank!