2014-09-13 16 views
8

Otrzymuję błąd podczas tłumaczenia kodu Objective-C na Swift.Przetłumacz NSRangePointer z Objective-C na Swift

Używam - attribute:atIndex:effectiveRange: z NSAttributedString i mam błąd dotyczący parametru effectiveRange, który jest NSRangePointer.

Objective-C:

NSRange range; 
id value = [self.textanalyze 
         attribute:attribute 
         atIndex:index 
       effectiveRange:&range] 

Swift:

var range : NSRange? 
var value : Any = self.textanalyze.attribute(attributes, 
         atIndex: index, 
       effectiveRange: &range) 

mam błąd w pobliżu &range.

Odpowiedz

11

Musisz odwijać zakres.

Należy również zainicjować zasięg. W przeciwnym razie spowoduje to awarię twojego programu.

var range : NSRange? = NSMakeRange(0, 1) 
self.textanalyze.attribute(attributes, atIndex: index, effectiveRange: &range!) 

Lub, jeśli nie chcesz, aby rozpakować swój zakres (to może być zerowa), przepisać swoją funkcję tak:

var range : NSRange? 
doSomethingWithRangePointer(&range) 

func doSomethingWithRangePointer(range : UnsafeMutablePointer<NSRange?>) { 
    // Do stuff 
} 

Ale może nie potrzebne, aby swoim przedziale An opcjonalnie w pierwszej kolejności (myślę, robi range kiedykolwiek muszą być zerowe Jeśli nie, to nie musi być dobrowolne?.), w tym przypadku, podobnie jak zakres inicjalizacji to będzie działać:

var range = NSMakeRange(0, 1) 
+1

To może zadziałać, ale czy nie byłoby łatwiej zadeklarować zakres jako nie-opcjonalny zamiast go rozpakować w wywołaniu funkcji? –

+0

@MartinR Pewnie, ale OP zakłada, że ​​zakres powinien być w pewnym momencie zerowy. W przeciwnym razie nie sądzę, by pozostawił swój zakres zadeklarowany jako opcjonalny. – michaelsnowden

+1

@MartinR Również to nie działa. To na pewno zadziała. Zobacz mój przykład powyżej. – michaelsnowden

1
let a = sizeof(NSRange) 
let objRangePtr:NSRangePointer = NSRangePointer.alloc(a) //alloc memory 
objLayoutManager.characterRangeForGlyphRange(range, actualGlyphRange:objRangePtr) 
let objRange = objRangePtr.move() //gain the value and dealloc() 
Powiązane problemy