2014-06-06 114 views
24

如何創建在迅速如何迅速字符串轉換爲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

在這種情況下,爲什麼不直接使用'let url = NSURL.fileURLWithPath(path,isDirectory:false)' –

+0

它們都是橋接的,只是將它們投射到 – Sulthan

+0

@EricD。你什麼意思? – ciccioska

回答

25

本地迅速字符串或NSString的一個CFString字符串只投它:

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

這適用於字符串文字,但不適用於變量。當我嘗試'var str = str1作爲CFString'和'str1'是'String'時,我得到「無法將表達式的類型'CFString'轉換爲鍵入'$ T1'。」當我明確鍵入'str'時,如'var str:CFString = str1 as CFString',我得到「不能將表達式的類型'CFString'轉換爲'CFString'類型。這是怎麼回事? – jchitel

+0

@jchitel我不知道你的「不能從'CFString'轉換爲'CFString'類型與蘋果開發論壇上提到的bug相關或類似 - > https://devforums.apple.com/message/1017628# 1017628? – TenaciousJay

+1

也許,這是幾個測試版本之前我的問題實際上是在測試版3中修復的我認爲 – jchitel

21

如果你想轉換非文字字符串,你必須將它轉換爲NSString。

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

let cfstring:CFString = string as NSString 

斯威夫特知道如何迅速字符串轉換爲一個NSString和一個NSString到CFString字符串,但似乎不知道如何做一個兩個步驟。

+1

我希望隨着Swift的發展,這類問題會得到改進! –

+0

1.0版本仍然存在問題:( –

3

您在CFString和NSString之間或NSString和String之間進行投射。訣竅是你必須在CFString和String之間進行雙重轉換。

這工作:

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

這使錯誤 「 'CFString字符串' 不 '的NSString' 的子類型」:

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

任何想法爲什麼是這樣? – Kamchatka

+0

我不知道爲什麼 - 如果這不是必需的,它會容易得多。我想編譯器還沒有成熟到足以實現這一點。 – user1021430

0

如果你正在嘗試轉換變量包含一個Swift字符串到CFString我認爲@freytag釘他的解釋。

如果任何人想看到一個例子,我想我會包含一個代碼片段,在這裏我將一個Swift字符串(在這種情況下爲「ArialMT」)轉換爲NSString,以便與核心文本中的CTFontCreateWithName函數(這需要一個CFString)。 (注意:從NSString到CFString的轉換是隱含的)。

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

今天我是想測試一個C API做的操場,只是import Foundation取得"string" as CFString工作。