2014-09-13 63 views
8

將某些Objective-C代碼翻譯成Swift時出現錯誤。將NSRangePointer從Objective-C轉換爲Swift

我正在使用- attribute:atIndex:effectiveRange:NSAttributedString並且有一個有關effectiveRange參數的錯誤,它是NSRangePointer

的Objective-C:

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

斯威夫特:

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

我走近&range錯誤。

回答

11

您需要展開範圍。

此外,您需要初始化範圍。否則,這會使程序崩潰。

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

或者,如果你不想解開你的範圍(可能是零),重寫你的函數是這樣的:

var range : NSRange? 
doSomethingWithRangePointer(&range) 

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

但你可能沒有必要讓你的範圍內可選擺在首位(想想,確實range永遠需要是零。如果沒有,那麼它並不需要是可選?),在這種情況下,只是初始化範圍這樣將工作:

var range = NSMakeRange(0, 1) 
+1

這可能會起作用,但將範圍聲明爲非可選,而不是在函數調用中解開它更容易嗎? – 2014-09-13 17:00:26

+0

@MartinR當然會,但是OP的暗示範圍應該是零點。否則,我認爲他不會將他的範圍聲明爲可選項。 – michaelsnowden 2014-09-13 17:01:50

+1

@MartinR另外,這不是這可能工作。這一定會奏效。看我上面的例子。 – michaelsnowden 2014-09-13 17:03:10

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()