2016-07-03 3 views
2

J'essaye d'ajouter une propriété stockée à un NSBezierPath en le sous-classant. Cependant, le code suivant plante Playground:Pourquoi cette sous-classe simple de NSBezierPath plante-t-elle mon OSX Playground?

import Cocoa 

class MyNSBezierPath: NSBezierPath { 

    private var someProperty: Bool 

    override init() { 
     someProperty = false 
     super.init() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     self.someProperty = false 
     super.init(coder: aDecoder) 
    } 
} 

// the following line causes the Playground to fully crash 
let somePath = MyNSBezierPath() 

L'erreur Aire de jeu (ci-dessous) semble indiquer un problème avec NSCoder mais je pensais que juste passer l'appel par la superclasse comme ce serait OK. Qu'est-ce que je fais mal?

UNCAUGHT EXCEPTION (NSInvalidUnarchiveOperationException): 
*** - [NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class 
(__lldb_expr_22.MyNSBezierPath) for key (root); 
the class may be defined in source code or a library that is not linked 
UserInfo: { "__NSCoderInternalErrorCode" = 4864;} 
Hints: None 
+1

Hmmm ... lire [cette autre réponse] (http://stackoverflow.com/questions/29867782/uibezierpath-subclass-initializer) il semble que le sous-classement NSBezierPa Cela peut être une mauvaise idée. Peut-être que je vais devoir aller avec un emballage - ce qui est dommage car il rend le code moins lisible :( –

+0

C'est un accident méchant aussi ... Je suis un peu surpris que Xcode ne gère pas mieux .. –

+0

Vous et moi les deux ... –

Répondre

1

Vous pouvez créer une extension pour ajouter une méthode à NSBezierPath. Ou vous pouvez utiliser OSBezierPath en appelant lineToPoint en utilisant l'initialiseur. Vous pouvez également utiliser OSBezierPath.

#if os(iOS) 
class OSBezierPath: UIBezierPath { 
    func lineToPoint(point:CGPoint) { 
     self.addLineToPoint(point) 
    } 
} 
#else 
typealias OSBezierPath = NSBezierPath 
#endif 

Une partie du code de Apple Swift

Ce n'est pas la même fonction bien sûr, mais je vous montre Apple à l'aide typealias OSBezierPath = UIBezierPath

EDIT: Vous pouvez créer une méthode de jeu et de l'utiliser au sein de votre INIT- méthode:

class SomeClass { 
var someProperty: AnyObject! { 
    didSet { 
     //do something 
    } 
} 

init(someProperty: AnyObject) { 
    setSomeProperty(someProperty) 
} 

func setSomeProperty(newValue:AnyObject) { 
    self.someProperty = newValue 
} 
} 
+0

Mais je ne veux pas ajouter une méthode, je veux ajouter une propriété stockée ... –

+0

Oui, mais ils sont tous liés en raison de votre problème provient de l'un de ces domaines. réponse mise à jour: – tymac

+0

donnez un exemple concret de ce que vous proposez, peut être utilisé pour ajouter une propriété stockée en sous-classant NSBezierPath. –