вывод значения в указатель на определение типа в swift - PullRequest
0 голосов
/ 25 апреля 2019

Я почти уверен, что название это не правильно, но здесь идет ...

Я соединяюсь с классом Objective C, чтобы установить typedef. Мост настроен, и я могу правильно объявить typedef var.

В Objective-C я также вызывал метод из того же класса, который при вызове выводил значение в переменную TestHandle.

var TestHandle : TESTHANDLE
TestInit(&TestHandle)

Когда я пытаюсь это сделать с помощью Swift 5, я получаю эту ошибку:

Cannot convert value of type 'inout TESTHANDLE' (aka 'inout UnsafeMutableRawPointer') to expected argument type 'UnsafeMutablePointer<TESTHANDLE?>?' (aka 'Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>')

Есть указатели?

1 Ответ

2 голосов
/ 25 апреля 2019

Некоторые наблюдения:

  • 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)
...