Объявление C
extern struct MYColors * appColors;
импортируется в Swift как
public var appColors: UnsafeMutablePointer!
Разыменование указателя выполняется в Swift через свойство pointee
, поэтому Swift эквивалентно ( Objective-) C-код
appColors->appBackgroundColor
-
appColors.pointee.appBackgroundColor
Тип этого значения - Unmanaged
, поскольку компилятор Swift не знает, как следует управлять памятью объекта. В вашем случае вызывающая сторона не несет ответственности за освобождение объекта, поэтому окончательный код:
let bgColor = appColors.pointee.appBackgroundColor.takeUnretainedValue()
Для получения дополнительной информации о неуправляемых ссылках см. Unmanaged
.
Примечание: Если appColors
и все члены структуры гарантированно не равны NULL при доступе, вы можете пометить их с помощью _Nonnull
в интерфейсе:
struct MYColors {
CGColorRef _Nonnull appBackgroundColor;
// ...
};
extern struct MYColors * _Nonnull appColors;
Затем компилятор Swift импортирует переменные как необязательные вместо (неявно развернутых).
Это прекрасно работает для меня как в Chrome, так и в Safari:
<html><body><p>Test</p>
<script>window.onbeforeunload = function() { return "Sure?"; }</script>
</body></html>
Когда я пытаюсь закрыть окно, я получаю приглашение.
Сам StackOverflow использует onbeforeunload
, и он отлично работает для меня в Safari:
function setConfirmUnload(a){window.onbeforeunload=a?function(){return a}:null}