【问题标题】:Creating a CTTypesetter in Swift在 Swift 中创建 CTTypesetter
【发布时间】:2014-06-09 00:02:06
【问题描述】:

我有一个创建 CFAttributedStringRef 的 obj-c 类:

- (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)
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

有人知道我做错了什么吗?

【问题讨论】:

    标签: cocoa swift


    【解决方案1】:

    我发现了问题,构建错误具有误导性。

    实际的问题是上一行——我的 obj-c 方法返回 CFAttributedStringRef 桥接到 Unmanaged<CFAttributedString> 并且需要通过 takeRetainedValue() 方法将其作为托管对象引入 Swift 才能使用:

    let stringToDraw = self.storage.createAttributedStringWithByteRange(self.line.range).takeRetainedValue()
    let typesetter = CTTypesetterCreateWithAttributedString(stringToDraw)
    

    【讨论】:

      【解决方案2】:

      您需要将对象类型称为CTTypesetterRef,而不是CTTypesetter

      import Foundation
      import CoreText
      
      
      extension NSString
      {
          func test() -> CTTypesetterRef
          {
              let attributedString : CFAttributedStringRef?
              let typesetter : CTTypeSetterRef = CTTypesetterCreateWithAttributedString(attributedString)
              return typesetter
          }
      }
      

      【讨论】:

      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多