不可变的值作为inout参数

时间:2016-07-27 14:23:38

标签: swift pointers inout

我想将指针作为类的参数。但是当我尝试编写init时,我遇到了这个错误:Cannot pass immutable value of type 'AnyObject?' as inout argument

class MyClass {
    var valuePointer: UnsafeMutablePointer<AnyObject?>

    init(value: inout AnyObject?) {
        self.valuePointer = &value
    }
}

我想创建一些MyClass的实例,它们都可以引用相同的“值”。然后,当我在这个类中编辑这个值时,它会在其他地方改变。

这是我第一次使用Swift中的指针。我想我做错了......

5 个答案:

答案 0 :(得分:15)

对于cannot pass immutable value as inout argument错误的人。首先检查您的参数是否为可选参数。 Inout类型似乎不喜欢可选值。

答案 1 :(得分:2)

初始化对象时可以发送指针:

class MyClass {
    var valuePointer: UnsafeMutablePointer<AnyObject?>

    init(value: inout UnsafeMutablePointer<AnyObject?>) {
        self.valuePointer = value
    }
}

在初始化MyClass时添加指针引用:

let obj = MyClass(value: &obj2)

答案 2 :(得分:0)

对我来说,我有一个这样定义的类变量:

// file MyClass.swift

class MyClass{

    var myVariable:SomeClass!

    var otherVariable:OtherClass!

    ...

    func someFunction(){
        otherVariable.delegateFunction(parameter: &myVariable) // error
    }
}

// file OtherClass.swift
class OtherClass{
    func delegateFunction(parameter: inout myVariable){
        // modify myVariable's data members 
    }
}

被调用的错误是:

Cannot pass immutable value as inout argument: 'self' is immutable

然后我将MyClass.swift中的变量声明更改为不再具有!而是最初指向某个类的虚拟实例。

var myVariable:SomeClass = SomeClass() 

然后,我的代码能够按预期进行编译和运行。所以...不知何故拥有!在类变量上,将阻止您将该变量作为inout变量传递。我不懂为什么。

答案 3 :(得分:0)

对于与我面临相同问题的人:

using (new TestCulture()) { // Tests which should be run under the specific culture }

代码如下:

Cannot pass immutable value as inout argument: implicit conversion from '' to '' requires a temporary

protocol FooProtocol { var a: String{get set} } class Foo: FooProtocol { var a: String init(a: String) { self.a = a } } func update(foo: inout FooProtocol) { foo.a = "new string" } var f = Foo(a: "First String") update(foo: &f)//Error: Cannot pass immutable value as inout argument: implicit conversion from 'Foo' to 'FooProtocol' requires a temporary 更改为var f = Foo(a: "First String")修复了错误。

答案 4 :(得分:0)

对我来说,我在这样的函数调用中传递直接值。

    public func testInout(_ a :  inout [Int]) -> Int {
        return a.reduce(0, +) 
    }

testInout(&[1,2,4]) // Getting the error :- Cannot pass immutable value of type '[Int]' as inout argument. Because by default the function parameters are constant.

要消除上述错误,您需要传递具有 var 类型的数组。如下图。

 var arr = [1, 2, 3] 
   public func testInout(_ a :  inout [Int]) -> Int {
            return a.reduce(0, +) 
        }
    
    testInout(&arr)