2015-05-19 22 views
9

jestem zaznajomiony z Objective CNie można przypisać wartości typu UnsafeMutablePointer ObjCBool ​​w Swift

Używam prywatną ramy i muszą być w stanie zmienić jedną z właściwości w moim kod SWIFT.

Obiekt jest zadeklarowana w Objective C w ten sposób:

@property (nonatomic, assign) BOOL *isSSNField; 

w szybkich Próbuję zmienić wartość właściwości w ten sposób:

myClass.isSSNField = true 

ja dostaję ten błąd

Cannot assign a value of type 'Bool' to a value of type 'UnsafeMutablePointer<ObjcBool>' 

Nie jestem pewien, dokąd się udać, lub dlaczego pojawia się ten błąd w ogóle

+4

Czy jesteś pewien, że właściwość powinna być * wskaźnikiem * do BOOL? –

+4

'BOOL * isSSNField' Jesteś pewien? Jest to bardzo nietypowy sposób deklarowania właściwości w Objective-C. 'BOOL *' jest bardzo rzadkim ptakiem. Sądzę, że to sprawiedliwe powiedzieć, że chociaż w praktyce (szczególnie w niektórych metodach wyliczeniowych) w moim życiu miałem "wyliczony" BOOL * ", nigdy nie widziałem ani nie używałem' BOOL * '_property_ w moim życiu. – matt

+0

Tak, to na pewno właściwość – YichenBman

Odpowiedz

16

Nigdy nie widziałem czegoś podobnego do sytuacji, którą opisujesz, i osobiście mam pokusę, aby powiedzieć, że sytuacja nie istnieje; Nigdy w życiu nie widziałem ani jednej nieruchomości, ani ivar w Objective-C (i jestem cholernie stara, uwierz mi). Jednakże, jeśli nalegać: Nie testowałem tego, ale myślę, że można powiedzieć coś takiego:

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

Jednakże, chociaż myślę, że będzie skompilować, jestem raczej jasne, na jakie są konsekwencje z robi się będzie. Może to spowodować, że wszechświat zapadnie się w czarną dziurę, więc bądź ostrożny.

+11

Tak, dajesz mi teraz znacznik wyboru, ale kiedy wszechświat zapadnie się do czarnej dziury, wrócisz . – matt

+0

Myślę, że znalazłem coś lepszego zanim wszechświat się zawali :) – accfews

+0

[SBJson] (https://github.com/stig/json-framework/blob/master/src/main/objc/SBJson4Parser.h) używa go jako typedef void (^ SBJson4ValueBlock) (id item, BOOL * stop); iw Swift jest konwertowany na: typ publiczny SBJson4ValueBlock = (AnyObject !, UnsafeMutablePointer ) -> Void – theguy

9

Aktualizacja Swift 3.1

dla typów wskaźnik Swift zapewnia pointee nieruchomość,

Documentation dla v3.1 mówi, że jest używany do uzyskiwania dostępu do instancji którego odwołuje się ten wskaźnik

można łatwo ustawić pole pointee

myClass.isSSNField.pointee = false 

A to jest taki sam dla wszystkich typów wskaźników i konwersji. Jeśli chcesz sprawdzić wartość obiektywnej C BOOL* Można łatwo

if myClass.isSSNField.pointee.boolValue 
+3

W Swift 3 '.memory' jest teraz' .pointee', dla przypadków, które widziałem do tej pory. –

+1

FWIW, 'NSAttributedString' ma' enumerateAttribute', który zwraca jeden z nich do użycia jak 'break' w pętli. Mylące. – Jonny

1

BOOL * w Objective-C jest wskaźnikiem od Bool.
Użyj UnsafeMutablePointer w Swift.

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

Następnie napraw to.

Podobnie jak w funkcji parametru isDirectory:

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

można użyć kodu:

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

bezpieczniejszy sposób obsłużyć to byłoby bardzo podobna do odpowiedzi @TanJunHao „s:

var isSSNField = ObjCBool(true) 
myClass.isSSNField = &isSSNField 
Powiązane problemy