web-dev-qa-db-ja.com

Swift StringをCFStringに変換する方法

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)
32
loopmasta

キャストしてください:

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

非リテラル文字列を変換する場合は、NSStringにキャストする必要があります。

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

let cfstring:CFString = string as NSString

Swiftは、Swift文字列をNSStringに、NSStringをCFStringに変換する方法を知っていますが、両方のステップを1つにまとめる方法を知らないようです。

27
freytag

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
4
user1021430

今日は、C APIをテストするために遊び場でこれをやろうとしていましたが、ただimport Foundation"string" as CFString仕事。

3
BoteRock

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