2015-06-30 2 views
1

Это просто упражнение в указателях в swift, но я пытался написать функцию, которая печатала бы указатель на себя, но я продолжал получать ошибку «не могу назначить к неизменяемому значению типа С ". Возможно ли это в Swift?Печать & self in swift, не может присваивать неизменяемое значение типа

class C { 
    static var c = C() 
    var a = 1 
    func printMyPointer() { 
     printPointer(&self) //cannot assign to immutable value of type C 
    } 

    func printPointer(ptr:UnsafePointer<C>) { 
     print(ptr) 
    } 
} 

C.c.printMyPointer() 

ответ

7

Как уже объяснено в другом ответе, вы не можете передать константу в качестве аргумента для параметра in-out. В качестве обходного пути, вы можете передать массив, как это будет на самом деле передать адрес первого элемента:

func printMyPointer() { 
    printPointer([self]) 
} 

Но еще проще, использовать unsafeAddressOf():

func printMyPointer() { 
    print(unsafeAddressOf(self)) 
} 

Обновление для Swift 3: Начиная с Xcode 8 beta 6, unsafeAddressOf больше не существует. Вы можете конвертировать self указателю:

print(Unmanaged.passUnretained(self).toOpaque()) 

или

print(unsafeBitCast(self, to: UnsafeRawPointer.self)) 
+0

Спасибо! Я фактически наткнулся на unsafeAddressOf за несколько секунд до этого сообщения, но я не знал об обходном пути массива. –

2

От Swift Docs:

Вы можете только передать переменную в качестве аргумента для параметра In-Out. Вы не можете передать в качестве аргумента значение константы или буква, потому что константы и литералы не могут быть изменены. Вы помещаете амперсанд (&) непосредственно перед именем переменной, когда передаете его в качестве аргумента для параметра inout, чтобы указать, что он может быть изменен функцией.

С self неизменен, вы не можете передать его как параметр inout. Даже если использование dosen't метод подписи inout, Swift обрабатывает параметры указателя как inout, согласно Swift blog:

Swift позволяет установить параметры указателя следует рассматривать как Inout параметров, так что вы можете передать ссылку на вар как аргумент указателя, используя тот же синтаксис &.

+0

я вижу. Можно ли получить адрес переменной без указания ее как параметра inout? –

Смежные вопросы