Cocoa 在Swift中创建CTX排版机
我有一个obj-c类,它创建了一个CFAttributedStringRef:Cocoa 在Swift中创建CTX排版机,cocoa,swift,Cocoa,Swift,我有一个obj-c类,它创建了一个CFAttributedStringRef: - (CFAttributedStringRef)createAttributedStringWithByteRange:(NSRange)byteRange { UInt8 bytes[byteRange.length]; [self.data getBytes:&bytes range:byteRange]; CFStringRef string = CFStringCreateWithBy
- (CFAttributedStringRef)createAttributedStringWithByteRange:(NSRange)byteRange
{
UInt8 bytes[byteRange.length];
[self.data getBytes:&bytes range:byteRange];
CFStringRef string = CFStringCreateWithBytes(NULL, bytes, byteRange.length, kCFStringEncodingUTF8, (byteRange.location == 0));
return CFAttributedStringCreate(NULL, string, (__bridge CFDictionaryRef)(self.textAttributes));
}
我试图从swift对象调用该函数,它应该创建一个CTTypesetter:
let stringToDraw = self.storage.createAttributedStringWithByteRange(self.line.range)
let typesetter = CTTypesetterCreateWithAttributedString(stringToDraw)
这给了我这个构建错误:
error: cannot convert the expression's type 'CTTypesetter!' to type '$T3'
let typesetter = CTTypesetterCreateWithAttributedString(stringToDraw)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有人知道我做错了什么吗?您需要将对象类型称为
CTTypesetterRef
,而不是CTTypesetter
import Foundation
import CoreText
extension NSString
{
func test() -> CTTypesetterRef
{
let attributedString : CFAttributedStringRef?
let typesetter : CTTypeSetterRef = CTTypesetterCreateWithAttributedString(attributedString)
return typesetter
}
}
我发现了问题,构建错误是误导性的 实际问题是前一行-我的obj-c方法返回
CFAttributedStringRef
桥接到非托管
,需要将其作为托管对象引入Swift,然后才能通过takeRetainedValue()
方法使用:
let stringToDraw = self.storage.createAttributedStringWithByteRange(self.line.range).takeRetainedValue()
let typesetter = CTTypesetterCreateWithAttributedString(stringToDraw)
根据CTTypesetter.h,它返回
CTTypesetter代码>非CTTypeSetterRef
。使用您的代码,我得到无法转换表达式的类型“CTTypesetter!”键入“CFAttributedString!”代码>-这是C/Obj-C参考。swift是func-CTTypesetterCreateWithAttributedString(\ustring:CFAttributedString!)->CTTypesetter代码>-