2014-06-06 11 views
24

Jak mogę utworzyć CFString z native szybkiej String lub NSString w szybkimJak przekonwertować szybkiego String do CFString

let path:String = NSBundle.mainBundle().pathForResource(name.stringByDeletingPathExtension, ofType:"pdf") 
    let string:CFString = ??? path 
    let url:CFURLRef = CFURLCreateWithFileSystemPath(allocator:kCFAllocatorDefault, filePath:string, pathStyle:CFURLPathStyle.CFURLPOSIXPathStyle, isDirectory:false) 
+1

W tym przypadku, dlaczego nie wystarczy użyć 'let url = NSURL.fileURLWithPath (path, isDirectory: false)' –

+0

wszystkie są zmostkowane, po prostu obsadź je – Sulthan

+0

@EricD. co masz na myśli? – ciccioska

Odpowiedz

25

Wystarczy rzucić go:

var str = "Hello, playground" as CFString 
NSString(format: "type id: %d", CFGetTypeID(str)) 
+2

Działa to dla literałów ciągowych, ale nie zmiennych. Kiedy próbuję 'var str = str1 jako CFString' i' str1' jest 'String', otrzymuję komunikat" Nie mogę przekonwertować typu wyrażenia 'CFString' na typ '$ T1'. " Kiedy jawnie wpisuję 'str', jak w' var str: CFString = str1 jako CFString', otrzymuję komunikat "Nie mogę przekonwertować typu wyrażenia" CFString "na typ" CFString "." Co się dzieje? – jchitel

+0

@jchitel Zastanawiam się, czy Twój "Nie można przekonwertować z" CFString "na typ" CFString "jest powiązany z błędem wspomnianym na forach firmy Apple lub podobnym do niego -> https://devforums.apple.com/message/1017628# 1017628? – TenaciousJay

+1

Być może, to było kilka wersji beta temu. Mój problem został naprawiony w wersji beta 3. – jchitel

21

Jeśli chcesz przekonwertować nie literał ciąg, musisz rzucić go do NSString.

let replacement = "World" 
let string = "Hello, \(replacement)" 

let cfstring:CFString = string as NSString 

Swift wie jak przekonwertować ciąg do szybkiego NSString i NSString do CFString, ale nie wydaje się wiedzieć, jak to zrobić zarówno czynności w jednym.

+1

Mam nadzieję, że ten problem zostanie ulepszony, ponieważ Swift ewoluuje! Używanie Core Foundation od Swift rani ... –

+0

Nadal występuje problem z wersją 1.0 :( –

3

Przerzucasz go między CFString a NSString lub pomiędzy NSString a String. Sztuczka polega na tym, że musisz podwoić obsadę, przechodząc między CFString a String.

to działa:

var cfstr: CFString = "Why does Swift require double casting!?" 
var nsstr: NSString = cfstr as NSString 
var str: String = nsstr as String 

To daje błąd " 'CFString' nie jest podtyp 'NSString'":

var cfstr: CFString = "Why does Swift require double casting!?" 
var str: String = cfstr as String 
+0

każdy pomysł, dlaczego tak jest? – Kamchatka

+0

Nie wiem dlaczego - byłoby to znacznie łatwiejsze, gdyby nie było to wymagane.Myślę, że kompilator po prostu nie dojrzał wystarczająco, aby było to możliwe . – user1021430

0

Jeśli próbujesz konwertować zmienną który zawiera ciąg Swift do CFString Myślę, że @freytag przybity to z jego wyjaśnieniem.

Jeśli ktoś chciał zobaczyć przykład, pomyślałem, że dołączę fragment kodu, w którym rzucam ciąg Swift ("ArialMT" w tym przypadku) do NSString, aby użyć go z funkcją CTFontCreateWithName z Core Text (który wymaga CFString). (Uwaga: rzutowanie z NSString na CFString jest niejawne).

// Create Core Text font with desired size 
    let coreTextFont:CTFontRef = CTFontCreateWithName("ArialMT" as NSString, 25.0, nil) 

    // Center text horizontally 
    var paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle() 
    paragraphStyle.alignment = NSTextAlignment.Center 

    // Center text vertically 
    let fontBoundingBox: CGRect = CTFontGetBoundingBox(coreTextFont) 
    let frameMidpoint = CGRectGetHeight(self.frame)/2 
    let textBoundingBoxMidpoint = CGRectGetHeight(fontBoundingBox)/2 
    let verticalOffsetToCenterTextVertically = frameMidpoint - textBoundingBoxMidpoint 

    // Create text with the following attributes 
    let attributes = [ 
     NSFontAttributeName : coreTextFont, 
     NSParagraphStyleAttributeName: paragraphStyle, 
     kCTForegroundColorAttributeName:UIColor.whiteColor().CGColor 
    ] 
    var attributedString = NSMutableAttributedString(string:"TextIWantToDisplay", attributes:attributes) 

    // Draw text (CTFramesetterCreateFrame requires a path). 
    let textPath: CGMutablePathRef = CGPathCreateMutable() 
    CGPathAddRect(textPath, nil, CGRectMake(0, verticalOffsetToCenterTextVertically, CGRectGetWidth(self.frame), CGRectGetHeight(fontBoundingBox))) 
    let framesetter: CTFramesetterRef = CTFramesetterCreateWithAttributedString(attributedString) 
    let frame: CTFrameRef = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attributedString.length), textPath, nil) 
    CTFrameDraw(frame, context) 
2

Dzisiaj starałem się zrobić to w boisko do testowania C API i tylko import Foundation wykonane "string" as CFString pracy.

Powiązane problemy