Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在Swift中创建CTX排版机_Cocoa_Swift - Fatal编程技术网

Cocoa 在Swift中创建CTX排版机

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

我有一个obj-c类,它创建了一个CFAttributedStringRef:

- (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-