Всем привет! Столкнулся с тем что никак не могу правильно инициализировать указатель.
Выполняю одно из заданий по лабе, где надо сравнить типизированные и нетипизированные указатели. Помогите кто чем может! Спасибо
Всем привет! Столкнулся с тем что никак не могу правильно инициализировать указатель.
Выполняю одно из заданий по лабе, где надо сравнить типизированные и нетипизированные указатели. Помогите кто чем может! Спасибо
Спасибо большое! А как разыменовываются указатели? И указатели на функции в swft можно вообще реализовать?)
Свифт не работает с указателями напрямую, такого понятия как “разыменовать указатель” нет. У указателя есть 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()
Сейчас в 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
Я не включил какой то флаг или теперь это по другому?
В 2023 можно так:
var a = 0
let mP = UnsafeMutablePointer<Int>(&a)
mP.pointee = 100
print(mP.pointee)