2014-09-13 4 views
8

일부 Objective-C 코드를 Swift로 변환 할 때 오류가 발생합니다.Objective-C에서 Swift로 NSRangePointer 번역

- attribute:atIndex:effectiveRange:NSAttributedString이고 매개 변수와 관련된 오류가 있습니다 (NSRangePointer).

목표 - 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 
} 

을하지만 당신은 당신의 범위을 만드는 데 필요한 않았을 수 있습니다

var range = NSMakeRange(0, 1) 
+1

그럴 수도 있지만 범위를 함수 호출에서 언 래핑하는 대신 선택 사항이 아닌 것으로 선언하는 것이 더 쉬울까요? –

+0

@MartinR 물론 그렇 겠지만, OP에는 암시 된 범위가 어느 시점에서 아무 것도 없어야합니다. 그렇지 않으면, 나는 그가 선택 사항으로 선언 한 그의 범위를 떠났을 것이라고 생각하지 않는다. – michaelsnowden

+1

@ Martin 또한이 방법이 효과가 없을 수도 있습니다. 이것은 확실히 작동 할 것입니다. 위의 예를 참조하십시오. – 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() 
: 처음에 선택하는 경우,이 같은 단지 초기화 범위는 작동 (?., 생각 range 이제까지하지 않으면, 그때는 선택 사양 일 필요가 없습니다 전무 할 필요가 않습니다)