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

#pointers #swift #ampersand

#указатели #swift #амперсанд

Вопрос:

  1. В Swift знак амперсанда amp; обозначает inout параметры. Нравится

    значение var = 3

    функция inoutfunc(inout onlyPara: Int) {

    onlyPara

    }

    inoutfunc(amp;value) // значение теперь равно 4

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

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

  3. Но почему тогда Swift преобразуется amp;error в NSErrorPointer , это автобокс?

    var errorPtr: NSErrorPointer = amp;ошибка

  4. И когда у меня есть NSErrorPointer . Как мне разыменовать его?

    ошибка var: NSError = *errorPtr // не будет работать


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

Комментарии:

1. Вы читали входные параметры из языка программирования Swift ?

2. Да только в swift (там не нужен NSErrorPointer, верно?) это просто, но это ничего не говорит (например, 3.:) почему NSError автоматически становится NSErrorPointer При использовании amp; и т. Д.

3. NSErrorPointer и его использование описаны в разделе «Отчеты об ошибках» в книге «Использование Swift с Cocoa и Objective-C»: developer.apple.com/library/prerelease/ios/documentation/Swift /.

Ответ №1:

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

 var error: NSError = errorPtr.memory!
  

Ответ №2:

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

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

 typealias NSErrorPointer = AutoreleasingUnsafePointer<NSError?>
  

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

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

Комментарии:

1. Но как NSError с амперсандом автоматически преобразуется в NSErrorPointer ? amp; Означает ли адрес? Я не читал этого в Swift.

2. В Swift нет фактических указателей. Все является объектом. amp; в основном означает: Create an object of type AutoreleasingUnsafePointer<Type>, where Type is the type of the object referenced by the amp; operator. Результирующий объект содержит тип и фактические указатели на память объекта, на который вы ссылаетесь. У вас нет прямого доступа к указателю, но вместо этого они дают вам приятный объект для работы.

3. Это было очень хорошее объяснение. Итак inout , ключевое слово создает это AutoreleasingUnsafePointer , но позволяет работать с фактическим объектом NSError внутри func вместо заданного аргумента ( amp; NSError ) . Это очень умно. Я люблю Swift все больше и больше.

4. Рад, что это имело смысл! Еще одна вещь; inout на самом деле ничего не создает. Это просто ключевое слово, которое сообщает компилятору, что функция, которая указывает inout для аргумента, принимает только один AutoreleasingUnsafePointer из этого аргумента.

Ответ №3:

Swift 3

 var errorPtr: NSErrorPointer = nil
callSomeFunctionThatReceivesParamByReference(.., error: errorPtr)
if let error = errorPtr?.pointee { ... }
  

Комментарии:

1. Можно ли не добавлять «?» за NSErrorPointer ?