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)
Il suffit de le lancer:
var str = "Hello, playground" as CFString
NSString(format: "type id: %d", CFGetTypeID(str))
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.
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
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.
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)