2015-05-19 8 views
9

Ich bin nicht vertraut mit Objective C.Wert kann nicht vom Typ UnsafeMutablePointer ObjCBool ​​in Swift

Ich bin mit einem privaten Rahmen zuweisen und muß in der Lage sein, eine der Eigenschaften aus meinem Swift Code zu ändern.

Die Liegenschaft befindet sich in Objective C auf diese Weise erklärt:

@property (nonatomic, assign) BOOL *isSSNField; 

in swift Ich versuche, den Wert der Immobilie auf diese Weise zu ändern:

myClass.isSSNField = true 

ich diesen Fehler

bin

Ich bin mir nicht sicher, wohin ich von hier gehen soll, oder warum ich diesen Fehler überhaupt bekomme

+4

Sind Sie sicher, dass die Eigenschaft ein * Zeiger * zu einem BOOL sein sollte? –

+4

'BOOL * isSSNField' Sind Sie sicher? Das ist eine sehr ungewöhnliche Möglichkeit, eine Eigenschaft in Objective-C zu deklarieren. Ein 'BOOL *' ist ein sehr seltener Vogel. Ich denke, es ist fair zu sagen, dass, obwohl ich _BOOL * in der Praxis (vor allem in bestimmten Aufzählungsmethoden) erlebt habe, ich noch nie ein BOOL * _ _property_ in meinem Leben gesehen oder benutzt habe. – matt

+0

ja das ist definitiv die Eigenschaft – YichenBman

Antwort

16

Ich habe noch nie etwas wie die Situation gesehen, die Sie beschreiben, und persönlich bin ich versucht zu sagen, dass die Situation nicht existiert; Ich habe nie ein BOOL* Eigentum oder Ivar in Objective-C in meinem Leben gesehen (und ich bin verdammt alt, glaube mir). Wenn Sie jedoch bestehen: ich dies nicht getestet, aber ich denke, Sie so etwas wie das sagen könnte:

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

Doch obwohl ich denke, dass wird kompilieren, ich bin ziemlich unklar, was die Auswirkungen von tun wäre es. Es könnte dazu führen, dass das Universum zu einem schwarzen Loch kollabiert, also sei vorsichtig.

+11

Ja, Sie geben mir das Häkchen jetzt, aber wenn das Universum zu einem schwarzen Loch zusammenbricht, werden Sie zurück sein . – matt

+0

Ich glaube, ich habe etwas besseres gefunden, bevor das Universum kollabiert :) – accfews

+0

[SBJson] (https://github.com/stig/json-framework/blob/master/src/main/objc/SBJson4Parser.h) verwendet es typedef void (^ SBJson4ValueBlock) (ID-Element, BOOL * stop); und in Swift wird konvertiert in: öffentliche typaliases SBJson4ValueBlock = (AnyObject !, UnsafeMutablePointer ) -> Void – theguy

9

Update für Swift 3.1

Für Zeigertypen Swift bietet pointee Eigenschaft,

Documentation für v3.1 sagt es für den Zugriff auf Instanz von diesem Zeiger verwiesen verwendet wird

Sie können leicht eingestellt das pointere Feld

myClass.isSSNField.pointee = false 

Und das ist für alle Zeigertypen und Konvertierungen gleich. Wenn Sie den Wert eines Objective C überprüfen BOOL* können Sie leicht

if myClass.isSSNField.pointee.boolValue 
+3

In Swift 3 ist '.memory' nun' .poittee' für die Fälle, die ich bisher gesehen habe. –

+1

FWIW, 'NSAttributedString' hat' enumerateAttribute', welches einen von diesen zur Verwendung als 'break' in einer Schleife zurückgibt. Verwirrend. – Jonny

1

BOOL * in Objective-C ein Zeiger von Bool ist.
Verwenden Sie UnsafeMutablePointer in Swift.

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

Dann beheben Sie es.

Genau wie der isDirectory Parameter in der Funktion:

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

Sie den Code verwenden können:

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

Der sicherere Weg, dies würde zu handhaben sehr ähnlich sein @TanJunHao ‚s Antwort:

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