Ошибка Swift: '&' используется с аргументом non-inout типа 'UnsafeMutablePointer'

Я пытаюсь преобразовать следующий код Objective C ( источник) из этого

-(CGRect) dimensionsForAttributedString: (NSAttributedString *) asp {

    CGFloat ascent = 0, descent = 0, width = 0;
    CTLineRef line = CTLineCreateWithAttributedString( (CFAttributedStringRef) asp);

    width = CTLineGetTypographicBounds( line, &ascent, &descent, NULL );

    // ...
}

в Свифт:

func dimensionsForAttributedString(asp: NSAttributedString) -> CGRect {

    let ascent: CGFloat = 0
    let descent: CGFloat = 0
    var width: CGFloat = 0
    let line: CTLineRef = CTLineCreateWithAttributedString(asp)

    width = CTLineGetTypographicBounds(line, &ascent, &descent, nil)

    // ...
}

Но я получаю ошибку с &ascent в этой строке:

width = CTLineGetTypographicBounds(line, &ascent, &descent, nil)

'&' используется с аргументом non-inout типа 'UnsafeMutablePointer'

Xcode предлагает исправить это, удалив &, Когда я это делаю, я получаю ошибку

Невозможно преобразовать значение типа 'CGFloat' в ожидаемый тип аргумента 'UnsafeMutablePointer'

В документации по взаимодействию с C API используются & синтаксис, поэтому я не вижу, в чем проблема. Как я могу исправить эту ошибку?

1 ответ

Решение

ascent а также descent должны быть переменными, чтобы быть переданными как аргументы in-out с &:

var ascent: CGFloat = 0
var descent: CGFloat = 0
let line: CTLineRef = CTLineCreateWithAttributedString(asp)
let width = CGFloat(CTLineGetTypographicBounds(line, &ascent, &descent, nil))

По возвращении из CTLineGetTypographicBounds()эти переменные будут установлены на подъем и спуск по линии. Также обратите внимание, что эта функция возвращает Doubleтак что вы захотите преобразовать это в CGFloat,

Другие вопросы по тегам