2014-09-13 20 views
8

Ich erhalte einen Fehler, wenn ich einen Objective-C-Code in Swift übersetze.NSRangePointer von Objective-C in Swift übersetzen

Ich verwende - attribute:atIndex:effectiveRange: von NSAttributedString und mit einem Fehler bezüglich der effectiveRange Parameter, der ein NSRangePointer ist.

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) 

bekam ich einen Fehler in der Nähe von &range.

Antwort

11

Sie müssen die Palette auspacken.

Außerdem müssen Sie den Bereich initialisieren. Andernfalls wird dies Ihr Programm zum Absturz bringen.

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

Oder, wenn Sie nicht Ihre Reichweite auszupacken wollen (es könnte Null sein), schreiben Sie Ihre Funktion wie folgt aus:

var range : NSRange? 
doSomethingWithRangePointer(&range) 

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

Aber Sie können nicht benötigt haben, um Ihren Bereich ein machen optional an erster Stelle (man denke, tut range immer null sein müssen Wenn nicht, müssen dann ist es nicht optional sein?.), in diesem Fall werden nur die Initialisierung Bereich wie folgt arbeiten:

var range = NSMakeRange(0, 1) 
+1

Das könnte funktionieren, aber wäre es nicht einfacher, den Bereich als nicht-optional zu deklarieren, anstatt ihn im Funktionsaufruf auszupacken? –

+0

@MartinR Sicher wäre, aber OP hat implizite Reichweite sollte zu keinem Zeitpunkt Null sein. Ansonsten glaube ich nicht, dass er seinen Bereich als optional deklariert hätte. – michaelsnowden

+1

@MartinR Es ist auch nicht so, dass das funktionieren könnte. Das wird definitiv funktionieren. Siehe mein Beispiel oben. – 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()