2015-03-13 17 views
6

sto cercando di compilare la seguente classe di Swift:proprietà dinamiche opzionali a Swift

class Waypoint: NSObject { 
    dynamic var coordinate: CLLocationCoordinate2D? 
} 

Ma ottengo il seguente errore del compilatore:

Property cannot be marked dynamic because its type cannot be represented in Objective-C

Se cambio coordinate di essere non-optional tutto funziona bene Suppongo che abbia senso, dato che Objective-C non ha alcun concetto di optionals. C'è qualche soluzione nota o soluzione alternativa?

+0

Non sono sicuro di cosa stai provando a fare. Probabilmente vuoi un osservatore su quella proprietà? Per quale scopo (solo per sapere quando la proprietà è cambiata)? Forse potrei suggerirti un'alternativa. – lchamp

+0

@lchamp correct, voglio un osservatore per l'integrazione con ReactiveCocoa – bloudermilk

risposta

11

In Objective-C, è possibile utilizzare nil per segnalare l'assenza di valore, ma solo per i tipi di oggetto. Swift generalizza questo (e lo rende sicuro dal testo) con il tipo generico Optional: puoi avere un Optional<NSObject>, a.k.a. NSObject?, ma puoi anche avere un Int? o un CLLocationCoordinate2D?.

Ma CLLocationCoordinate2D è una struct - se lo si utilizza in Objective-C, non è possibile assegnare nil ad una variabile di tipo CLLocationCoordinate2D. Questo è il motivo per cui ottieni questo errore.

Per quanto riguarda un workaround (brutto), si potrebbe avvolgere CLLocationCoordinate2D in un oggetto:

class CLLocationCoordinate2DObj: NSObject { 
    let val: CLLocationCoordinate2D 
    init(_ val: CLLocationCoordinate2D) { 
     self.val = val 
    } 
} 

class Waypoint: NSObject { 
    dynamic var coordinate: CLLocationCoordinate2DObj? 
} 

Purtroppo, non è possibile trovare una soluzione più generale, con una classe wrapper oggetto generico per le strutture, come Objective- C non ha generici ... Un'alternativa sarebbe usare NSValue come tipo di oggetto come described here, ma dubito che sarebbe più elegante.

+0

Grazie per la risposta rapida. Penso che creerò la mia classe 'Coordinate' come consigliato e gli darò un metodo' toCLLocationCoordinate2D' a meno che non ci sia un modo più elegante per supportare il typecasting come: 'coordinate come CLLocationCoordinate2D' – bloudermilk

Problemi correlati