Что это за тип NSErrorPointer?

  1. В Swift знак амперсанда & предназначен для inout параметров. Нравится

    значение переменной = 3

    func inoutfunc (inout onlyPara: Int) {

    onlyPara ++

    }

    inoutfunc (& value) // теперь значение 4

    Это не похоже на то, что onlyPara является указателем, возможно, так оно и есть, и сразу получить разыменование при использовании его внутри функции. Является ли onlyPara указателем?

  2. Когда мне не нужен тип IntPointer, почему методы фреймворка используют тип NSErrorPointer? Потому что они не могут изменить методы из-за существующего кода Objective-C?

  3. # P8 #
    # P9 #
  4. # P10 #
    # P11 #

Может кто меня просветит. Использовать только Swift очень просто. Я думаю, что вопросы - это одна часть знаний о & между swift и Objective-C (как адрес оператора)


person Binarian    schedule 27.06.2014    source источник
comment
Вы читали Параметры ввода-вывода из языка программирования Swift?   -  person Kreiri    schedule 27.06.2014
comment
Да только в быстром режиме (NSErrorPointer не нужен, верно?), Это просто, но это ничего не говорит (например, 3. :) почему NSError автоматически становится NSErrorPointer при использовании & и т. Д.   -  person Binarian    schedule 27.06.2014
comment
NSErrorPointer и его использование описано в отчете об ошибках в книге Использование Swift с какао и Objective-C: developer.apple.com/library/prerelease/ios/documentation/Swift/.   -  person Martin R    schedule 27.06.2014


Ответы (3)


Я предлагаю вам прочитать раздел «Указатели» в руководстве «Использование Swift с какао и Objective-C»: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/IntectingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_16

Внизу раздела «Указатели» есть таблица, в которой объясняется, как указатели классов соединяются с типами указателей Swift. Исходя из этого, указатель NSError должен быть AutoreleasingUnsafePointer<NSError>. Поиск по заголовкам для NSErrorPointer дает следующее:

typealias NSErrorPointer = AutoreleasingUnsafePointer<NSError?>

Почему лишние ? после NSError? Я думаю, это потому, что NSError также может быть nil.

Надеюсь, поможет!

person Jernej Strasner    schedule 27.06.2014
comment
Но как NSError с амперсандом автоматически конвертируется в NSErrorPointer? & означает адрес? Я не читал этого в Swift. - person Binarian; 27.06.2014
comment
В Swift нет настоящих указателей. Все есть объект. & в основном означает: Create an object of type AutoreleasingUnsafePointer<Type>, where Type is the type of the object referenced by the & operator. Результирующий объект содержит тип и фактические указатели на память объекта, на который вы ссылаетесь. У вас нет прямого доступа к указателю, но вместо этого они дают вам хороший объект для работы. - person Jernej Strasner; 27.06.2014
comment
Это было очень хорошее объяснение. Таким образом, ключевое слово inout создает это AutoreleasingUnsafePointer, но позволяет работать с фактическим объектом NSError внутри func вместо данного аргумента (& NSError). Это очень умно. Я люблю Swift все больше и больше. - person Binarian; 28.06.2014
comment
Рад, что это имело смысл! Еще кое-что; inout на самом деле ничего не создает. Это просто ключевое слово, которое сообщает компилятору, что функция, которая указывает inout в качестве аргумента, принимает только AutoreleasingUnsafePointer этого аргумента. - person Jernej Strasner; 05.07.2014

Решение 4. Я узнал, как разыменовать его:

var error: NSError = errorPtr.memory!
person Binarian    schedule 27.06.2014

Swift 3

var errorPtr: NSErrorPointer = nil
callSomeFunctionThatReceivesParamByReference(.., error: errorPtr)
if let error = errorPtr?.pointee { ... }
person Prcela    schedule 27.06.2016
comment
Можно не добавлять? за NSErrorPointer? - person Binarian; 27.06.2016