这只是swift中指针的一个练习,但是我试图编写一个函数来打印指向self的指针,但我不断收到错误“无法分配给C类的不可变值”。这在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()
答案 0 :(得分:7)
正如在另一个答案中已经解释的那样,你不能传递常数 作为输入输出参数的参数。作为一种解决方法,你可以 传递一个数组,因为它实际上会传递第一个的地址 元素:
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))
答案 1 :(得分:2)
来自Swift Docs:
您只能将变量作为输入输出参数的参数传递。您不能传递常量或文字值作为参数,因为不能修改常量和文字。将一个&符号(&amp;)直接放在变量名称之前,当它作为参数传递给inout参数时,表示它可以被函数修改。
由于self
是不可变的,因此您无法将其作为inout
参数传递。即使方法签名不使用inout
,Swift也会根据Swift blog处理指针参数,例如inout
:
Swift允许将指针参数视为inout参数,因此您可以通过使用相同的&amp;来传递对var作为指针参数的引用。句法。