Быстрый синтаксис: 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.