Подтвердить что ты не робот

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

Как я могу создать CFString из собственной быстрой строки String или 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)
4b9b3361

Ответ 1

Просто бросьте его:

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

Ответ 2

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

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

let cfstring:CFString = string as NSString

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

Ответ 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

Ответ 4

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

Ответ 5

Если вы пытаетесь преобразовать переменную, содержащую строку 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)