Некоторые наблюдения:
TESTHANDLE
представляется псевдонимом для UnsafeMutableRawPointer
&testHandle
, который берет ссылку (указатель на местоположение) testHandle
, производя значение типа inout UnsafeMutableRawPointer
- Как говорит ошибка, ваша
TestInit
функция принимает переменную типа UnsafeMutablePointer<TESTHANDLE?>?
, она же Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>
Swiftесть некоторые правила о том, как &
автоматически связывает с различными типами указателей, но, честно говоря, я не очень хорошо понимаю их.
Насколько я знаю, типы указателей Swift не могут представлять nil (0x000 ... 000).Для этого они должны быть заключены в необязательный.Поэтому, когда вы видите тип
Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>
На самом деле это две "семантические" части:
Optional<UnsafeMutablePointer< Optional<UnsafeMutableRawPointer> >>
↳ A nullable pointer to ... ↳ ... something that's a nullable pointer of unspecified (void) type
Причина, по которой вы получаете ошибку, заключается в том, что &testHandle
может только соединить вашу *От 1029 * до Optional<UnsafeMutablePointer<UnsafeMutableRawPointer>>
, но не требуется Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>
(разница в том, что пропущен слой «внутренней» обнуляемости).Чтобы обойти это, сделайте ваш testHandle
необязательным, самостоятельно:
var testHandle: TESTHANDLE? // a.k.a. Optional<TESTHANDLE>, a.k.a. Optional< UnsafeMutableRawPointer>
Затем, когда вы используете оператор &
, Swift обернет ваше значение в необходимый Optional<UnsafeMutablePointer< ... >>
внешний слой.
typealias TESTHANDLE = UnsafeMutableRawPointer
func testInit(_ p: UnsafeMutablePointer<TESTHANDLE?>?) {
print("Success!")
}
var testHandle: TESTHANDLE? = nil
testInit(&testHandle)