SwiftでネイティブのSwift StringまたはNSStringから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)
キャストしてください:
var str = "Hello, playground" as CFString
NSString(format: "type id: %d", CFGetTypeID(str))
非リテラル文字列を変換する場合は、NSStringにキャストする必要があります。
let replacement = "World"
let string = "Hello, \(replacement)"
let cfstring:CFString = string as NSString
Swiftは、Swift文字列をNSStringに、NSStringをCFStringに変換する方法を知っていますが、両方のステップを1つにまとめる方法を知らないようです。
CFStringとNSStringの間、またはNSStringとStringの間でキャストします。秘Theは、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
今日は、C APIをテストするために遊び場でこれをやろうとしていましたが、ただimport Foundation
製 "string" as CFString
仕事。
Swift文字列を含むCFStringに含まれる変数を変換しようとしている場合、@ freytagは彼の説明でそれを釘付けにしたと思います。
誰かが例を見てみたいと思った場合、Swift=文字列(この場合は "ArialMT")をNSStringにキャストするコードスニペットを含めると思いました。 Core Textの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)