Быстрый синтаксис: UnsafeMutablePointers в CGPDFDocument.getVersion

Может кто-нибудь объяснить, как я должен использовать метод 'getVersion' для CGPDFDocument в Swift? Документация Apple дает:

func getVersion(majorVersion: UnsafeMutablePointer<Int32>, 
   minorVersion: UnsafeMutablePointer<Int32>)

"По возвращении значения параметров majorVersion и minorVersion устанавливаются на номера старших и младших версий документа соответственно".

Итак, я предоставляю две переменные в качестве аргументов функции, и они заполняются значениями при выходе? Нужно ли им указывать на что-то конкретное перед вызовом метода? Почему бы просто не ввести их как целые числа, если это то, что возвращаемые значения?

1 ответ

Решение

Вы используете это так:

var major: Int32 = 0
var minor: Int32 = 0
document.getVersion(majorVersion: &major, minorVersion: &minor)
print("Version: \(major).\(minor)")

Функция ожидает указатели, но если вы передаете в простом Int32 переменные с & оператор, Swift-компилятор достаточно умен, чтобы вызывать функцию с указателями на переменные. Это задокументировано в Использовании Swift с Какао и Objective-C: Взаимодействие с C API.

Основная причина того, что функция работает так, это то, что это очень старая функция C, которая была импортирована в Swift. C не поддерживает кортежи как возвращаемые значения; использование указателей в качестве входных и выходных параметров - это способ заставить функцию возвращать более одного значения. Можно утверждать, что было бы лучше разработать определенную структуру для возвращаемого типа, чтобы функция могла возвращать два значения в одном типе, но разработчики этой функции, очевидно, не думали, что это необходимо - возможно, неудивительно, потому что этот шаблон очень распространен в C.

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