Указатели в Swift


#1

Всем привет! Столкнулся с тем что никак не могу правильно инициализировать указатель.

Выполняю одно из заданий по лабе, где надо сравнить типизированные и нетипизированные указатели. Помогите кто чем может! Спасибо


#2
let p: UnsafePointer<Int>
var a = 0

p = {$0}(&a)

#3

Спасибо большое! А как разыменовываются указатели? И указатели на функции в swft можно вообще реализовать?)


#4

Свифт не работает с указателями напрямую, такого понятия как “разыменовать указатель” нет. У указателя есть pointee, это доступ к значению на которое ссылается указатель:

let p: UnsafePointer<Int>
var a = 0

p = {$0}(&a)

print(p.pointee) // 0

Что бы изменить значение нужно использовать UnsafeMutablePointer:

let mP: UnsafeMutablePointer<Int>
var a = 0

mP = {$0}(&a)

mP.pointee = 100

print(mP.pointee) // 100

Указатель на функцию нельзя реализовать, но можно реализовать указатель на замыкание и передать туда функцию:

let mP = UnsafeMutablePointer<(Int) -> Void>.allocate(capacity: 1)

func test(i: Int) {
    print(i)
}

mP.initialize(to: test)

mP.pointee(100)

mP.deinitialize()
mP.deallocate(capacity: 1)

Или так:

let p: UnsafePointer<() -> Void>

func test() {
    print("Hello")
}

var f = test

p = {$0}(&f)

p.pointee()

#5

Огромное спасибо!!!


#6

Сейчас в 2022 не один пример на странице не работает в последней версии xcode.
В чистый playground закидываю любой код с

{$0}(&f)

и получаю ошибки типа error: cannot convert value of type ‘Int’ to closure result type ‘UnsafeMutablePointer’
на всех примерах.

вот пример, один из тех что выше:

let mP: UnsafeMutablePointer<Int>
var a = 0

mP = {$0}(&a)

mP.pointee = 100

print(mP.pointee) // 100

Я не включил какой то флаг или теперь это по другому?


#7

В 2023 можно так:

var a = 0
let mP = UnsafeMutablePointer<Int>(&a)

mP.pointee = 100
print(mP.pointee)