2015-05-19 9 views
9

Sono familiarità con Objective C.Non è possibile assegnare valore di tipo UnsafeMutablePointer ObjCBool ​​a Swift

sto usando un quadro privato e la necessità di essere in grado di cambiare una delle proprietà da dentro il mio codice Swift.

La proprietà viene dichiarata in Objective C questo modo:

@property (nonatomic, assign) BOOL *isSSNField; 

in rapida sto cercando di modificare il valore della proprietà in questo modo:

myClass.isSSNField = true 

sto ottenendo questo errore

Non sono sicuro di dove andare da qui, o perché sto ottenendo questo errore a tutti

+4

Sei sicuro che la proprietà dovrebbe essere un * puntatore * a un BOOL? –

+4

'BOOL * isSSNField' Sei sicuro? Questo è un modo molto insolito per dichiarare una proprietà in Objective-C. Un 'BOOL * 'è un uccello molto raro. Penso che sia giusto dire che, sebbene io abbia _encountered_ 'BOOL *' in pratica (specialmente in alcuni metodi di enumerazione), non ho mai visto o usato un 'BOOL *' _property_ nella mia vita. – matt

+0

sì questa è sicuramente la proprietà – YichenBman

risposta

16

Non ho mai visto nulla di simile alla situazione che descrivi, e personalmente sono tentato di dire che la situazione non esiste; Non ho mai visto una proprietà BOOL* o ivar in Objective-C nella mia vita (e sono dannatamente vecchio, credimi). Tuttavia, se insistete: non ho ancora testato questo, ma penso che si potrebbe dire qualcosa di simile:

var ok = UnsafeMutablePointer<ObjCBool>.alloc(1) 
ok[0] = false // or true 
let val = ok 
myClass.isSSNField = val 

Tuttavia, anche se penso che sarà compilare, io sono piuttosto chiare su quali siano le implicazioni di facendo sarebbe. Potrebbe far collassare l'universo in un buco nero, quindi fai attenzione.

+11

Sì, mi stai dando il segno di spunta ora, ma quando l'universo collassa in un buco nero, tornerai . – matt

+0

Penso di aver trovato qualcosa di meglio prima che l'universo collassi :) – accfews

+0

[SBJson] (https://github.com/stig/json-framework/blob/master/src/main/objc/SBJson4Parser.h) lo utilizza vuoto typedef (^ SBJson4ValueBlock) (elemento id, BOOL * stop); e in Swift è convertito in: typealias pubbliche SBJson4ValueBlock = (AnyObject !, UnsafeMutablePointer ) -> Void – theguy

9

Aggiornamento per Swift 3.1

Per i tipi di puntatore Swift offre pointee proprietà,

Documentation per v3.1 dice che è utilizzato per l'accesso ai esempio a cui fa riferimento questo puntatore

È possibile impostare facilmente il campo da punta

myClass.isSSNField.pointee = false 

E questo è uguale per tutti i tipi di puntatori e conversioni. Se si desidera controllare il valore di un C Obiettivo BOOL* Si può facilmente

if myClass.isSSNField.pointee.boolValue 
+3

In Swift 3, '.memory' è ora' .pointee', per i casi che ho visto finora. –

+1

FWIW, 'NSAttributedString' ha' enumerateAttribute', che restituisce uno di questi da usare come un 'break' in un ciclo. Confondere. – Jonny

1

BOOL * in Objective-C è un puntatore di Bool.
Utilizzare UnsafeMutablePointer in Swift.

var isSSNField: ObjCBool = true 
myClass.isSSNField = &isSSNField 

Quindi aggiustarlo.

Proprio come il parametro isDirectory nella funzione:

func fileExists(atPath path: String, isDirectory:UnsafeMutablePointer<ObjCBool>?) -> Bool 

È possibile utilizzare il codice:

var isDirectory:ObjCBool = true 
var isFileExists = FileManager.default.fileExists(atPath: <#YourPath#>, isDirectory: &isDirectory) 
1

Il modo più sicuro per gestire questa situazione sarebbe molto simile alla risposta s' @TanJunHao:

var isSSNField = ObjCBool(true) 
myClass.isSSNField = &isSSNField 
Problemi correlati