Как преобразовать быструю строку в CFString

Как я могу создать CFString из собственной быстрой строки или NSString в Swift

    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)

person loopmasta    schedule 06.06.2014    source источник
comment
В таком случае, почему бы просто не использовать let url = NSURL.fileURLWithPath(path, isDirectory:false)   -  person David Berry    schedule 07.06.2014
comment
они все мостовые, просто бросьте их   -  person Sulthan    schedule 07.06.2014
comment
@ЭрикД. что ты имеешь в виду?   -  person ciccioska    schedule 04.11.2015
comment
@ЭрикД. Я понимаю, но я думаю, что это вопрос IOS, и не только я, я полагаю... спасибо   -  person ciccioska    schedule 04.11.2015


Ответы (5)


Просто произнесите это:

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

Обратите внимание, что вам понадобится import Foundation для работы as CFString.
В противном случае, если у вас есть только import CoreFoundation, вам нужно принудительно применить as! CFString.

person MagerValp    schedule 06.06.2014

Если вы хотите преобразовать нелитеральную строку, вы должны преобразовать ее в NSString.

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

let cfstring:CFString = string as NSString

Swift знает, как преобразовать быструю строку в NSString и NSString в CFString, но, похоже, не знает, как сделать оба шага за один.

person freytag    schedule 18.07.2014
comment
Я надеюсь, что эта проблема будет решена по мере развития Swift! Использование Core Foundation от Swift причиняет боль... - person John M. P. Knox; 31.07.2014
comment
Все еще проблема с выпуском 1.0 :( - person Tristan Warner-Smith; 24.09.2014

Вы переводите его между 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
person user1021430    schedule 23.07.2014
comment
любая идея, почему это? - person Kamchatka; 13.09.2014
comment
Не знаю почему - было бы намного проще, если бы этого не требовалось. Я предполагаю, что компилятор просто недостаточно созрел, чтобы сделать это возможным. - person user1021430; 15.09.2014

Сегодня я пытался сделать это на игровой площадке для тестирования C API и просто import Foundation заставил "string" as CFString работать.

person BoteRock    schedule 09.01.2016

Если вы пытаетесь преобразовать переменную, содержащую строку Swift, в CFString, я думаю, что @freytag объяснил это правильно.

На случай, если кто-то захочет увидеть пример, я подумал, что включу фрагмент кода, в котором я привожу строку Swift (в данном случае «ArialMT») к NSString, чтобы использовать ее с функцией CTFontCreateWithName из Core Text (для чего требуется 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)
person TenaciousJay    schedule 07.08.2014