web-dev-qa-db-fra.com

Comment convertir une chaîne Swift en CFString

Comment créer une chaîne CFString à partir d'une chaîne Swift ou d'une chaîne NSString native dans 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)
30
loopmasta

Il suffit de le lancer:

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

Si vous voulez convertir une chaîne non littérale, vous devez la convertir en NSString. 

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

let cfstring:CFString = string as NSString

Swift sait comment convertir une chaîne Swift en NSString et une NSString en CFString, mais ne semble pas savoir comment effectuer les deux étapes en une.

25
freytag

Vous le diffusez entre CFString et NSString, ou entre NSString et String. Le truc, c'est que vous devez doubler la distribution lorsque vous passez entre CFString et String.

Cela marche:

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

Cela donne l'erreur "'CFString' n'est pas un sous-type de 'NSString'":

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

Aujourd'hui, j'essayais de faire cela dans un terrain de jeu pour tester une API C et import Foundation permettait à "string" as CFString de fonctionner.

3
BoteRock

Si vous essayez de convertir une variable qui contient une chaîne Swift en une chaîne CFString, je pense que @freytag a cloué le message avec son explication.

Au cas où quelqu'un voudrait voir un exemple, je pensais inclure un extrait de code dans lequel je jette une chaîne Swift ("ArialMT" dans ce cas) sur une chaîne NSString afin de l'utiliser avec la fonction CTFontCreateWithName de Core Text CFString). (Remarque: la conversion de NSString vers CFString est implicite).

    // 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)
0
TenaciousJay