#pointers #swift #ampersand
#указатели #swift #амперсанд
Вопрос:
-
В Swift знак амперсанда
amp;
обозначаетinout
параметры. Нравитсязначение var = 3
функция inoutfunc(inout onlyPara: Int) {
onlyPara
}
inoutfunc(amp;value) // значение теперь равно 4
Это не похоже
onlyPara
на указатель, может быть, это так и есть, и при использовании его внутри функции немедленно разыменовываются. Является ли onlyPara указателем? -
Когда мне не нужен
IntPointer
тип, почему методы фреймворка используютNSErrorPointer
тип?Потому что они не могут изменить методы из-за существующего кода Objective-C? -
Но почему тогда Swift преобразуется
amp;error
вNSErrorPointer
, это автобокс?var errorPtr: NSErrorPointer = amp;ошибка
-
И когда у меня есть
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 ?