2014-06-06 7 views
24

konvertieren Wie kann ich eine CFString von einem nativen schnellen String oder NSString in schnellenWie eine schnelle String zu 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

In diesem Fall, warum nicht einfach verwenden Sie "let url = NSURL.fileURLWithPath (Pfad, isDirectory: false)" –

+0

sie sind alle überbrückt, einfach umwandeln sie – Sulthan

+0

@EricD. Was meinen Sie? – ciccioska

Antwort

25

gerade werfen es schaffen:

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

Dies funktioniert für String-Literale, aber nicht für Variablen. Wenn ich versuche 'var str = str1 als CFString' und' str1' ist ein 'String', bekomme ich" Kann den Ausdruckstyp 'CFString' nicht in '$ T1' umwandeln. " Wenn ich 'str' explizit schreibe, wie in' var str: CFString = str1 als CFString', bekomme ich "Kann den Ausdruckstyp 'CFString' nicht in 'CFString' umwandeln." Was ist los? – jchitel

+0

@jchitel Ich frage mich, ob Ihr "Kann nicht konvertieren von 'CFString' auf den Typ 'CFString' ist oder ähnlich zu dem Fehler in den Apple Dev Foren hier -> https://devforums.apple.com/message/1017628# 1017628? – TenaciousJay

+1

Vielleicht war das ein paar Beta-Versionen vor. Mein Problem wurde tatsächlich in Beta 3 behoben Ich denke – jchitel

21

Wenn Sie ein konvertieren möchten Nicht-literale Zeichenfolge muss in NSString umgewandelt werden.

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

let cfstring:CFString = string as NSString 

Swift weiß, wie eine schnelle Zeichenfolge in eine NSString und ein NSString zu einem CFString zu konvertieren, scheint aber nicht zu wissen, wie in einem beiden Schritte zu tun.

+1

Ich hoffe, dass diese Art von Problem verbessert wird, wie Swift evolves! Mit Core Foundation von Swift tut weh ... –

+0

Immer noch ein Problem mit 1.0 Release :( –

3

Sie können es zwischen CFString und NSString oder zwischen NSString und String umwandeln. Der Trick ist, dass Sie Doppel-Cast haben müssen, wenn Sie zwischen CFString und String gehen.

Dies funktioniert:

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

Dies gibt den Fehler " 'CFString' ist kein Subtyp von 'NSString'":

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

irgendeine Idee, warum ist das? – Kamchatka

+0

Ich weiß nicht warum - es wäre viel einfacher, wenn dies nicht erforderlich wäre. Ich denke, dass der Compiler gerade nicht genug gereift ist, um dies zu ermöglichen . – user1021430

0

Wenn Sie versuchen, eine Variable zu konvertieren Das enthält eine schnelle Zeichenfolge zu einem CFString. Ich denke @freytag hat es mit seiner Erklärung genagelt.

Falls jemand ein Beispiel sehen wollte, dachte ich, ich würde ein Code-Snippet einfügen, wo ich eine Swift-Zeichenfolge ("ArialMT" in diesem Fall) an einen NSString übergeben, um es mit der CTFontCreateWithName -Funktion von Core Text zu verwenden (benötigt einen CFString). (Hinweis: Die Umwandlung von NSString in CFString ist implizit).

// 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

Heute war ich versuche, dies für die Prüfung eines C-API in einem Spielplatz zu tun und import Foundation nur "string" as CFString Arbeit gemacht.

Verwandte Themen