在swift中打印和自我,不能分配给类型的不可变值

时间:2015-06-30 17:35:04

标签: swift

这只是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()

2 个答案:

答案 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作为指针参数的引用。句法。