声明指向属性的指针,并将其作为inout参数传递给Swift中的func?

声明指向属性的指针,并将其作为inout参数传递给Swift中的func?,swift,parameters,reference,unsafemutablepointer,inout,Swift,Parameters,Reference,Unsafemutablepointer,Inout,我需要从一些属性中选择一个并通过引用传递它,以便在func中设置它。近似代码: var someProperty = [SomeClass]() var someProperty2 = [SomeClass]() func someFunc(someObject: inout [SomeClass]) { ... someObject = ... // } //usage code let obj: [SomeClass] if someCase { obj = se

我需要从一些属性中选择一个并通过引用传递它,以便在func中设置它。近似代码:

var someProperty = [SomeClass]()
var someProperty2 = [SomeClass]()

func someFunc(someObject: inout [SomeClass]) {
    ...
    someObject = ... //
}

//usage code
let obj: [SomeClass]
if someCase {
    obj = self.someProperty
    ...
} else {
    obj = self.someProperty2
    ...
}
someFunc(&obj)
问题是,
obj
is不能用作
inout
参数,但即使我将其声明为
var
,那么
obj
也会更改,但不会更改
someProperty
someProperty2

我读到,不知何故,我需要将
obj
声明为
unsafemeutablepointer
,还有类似的问题。但我不知道如何将它们应用到上面的代码中,以仅修复这3行代码(而不更改其余代码):

如何解决这个问题


另一方面,换句话说,我需要类似于
let-obj:inout[SomeClass]
的东西,但Swift不允许这样做显然,我最初对这个问题的理解是模糊的,因此,有了最新的(希望是准确的)理解,我将通过给出具体的(可编译的)内容来重新表达这个问题我认为OP想要做什么的代码,然后给出我的解决方案

我重新命名了一些东西,使之更具体,并在代码中表达它们的角色。给定如下代码:

var sourceArray1=[1,2,3,4]
var sourceArray2=[5,6,7,8]
func someFunc(someArray:inout[Int]){
someArray.index.forEach{someArray[$0]=0}
}
让someCase=true//只是为了编译一个具体的案例
//使用代码
变量arrayProxy:[Int]
万一{
arrayProxy=sourceArray1
//一些可能涉及或可能不涉及arrayProxy的附加代码
}否则{
arrayProxy=sourceArray2
//一些可能涉及或可能不涉及arrayProxy的附加代码
}
someFunc(&arrayProxy)
打印(“sourceArray1=\(sourceArray1)”)
打印(“sourceArray2=\(sourceArray2)”)
实际输出为

sourceArray1 = [1, 2, 3, 4]
sourceArray2 = [5, 6, 7, 8]
sourceArray1 = [0, 0, 0, 0]
sourceArray2 = [5, 6, 7, 8]
但是期望的输出是

sourceArray1 = [1, 2, 3, 4]
sourceArray2 = [5, 6, 7, 8]
sourceArray1 = [0, 0, 0, 0]
sourceArray2 = [5, 6, 7, 8]
因此,无论
if
语句选择哪个源数组,都是要更改的数组,
arrayProxy
,尽管它可以在以后的代码中使用,但对于此处所需的效果来说并不重要

我不认为指针是正确的解决方案。我认为稍微修改一下设计会更好。我们需要的是改变一个源数组,那么为什么不这样做呢?我的解决办法是:

var sourceArray1=[1,2,3,4]
var sourceArray2=[5,6,7,8]
func someFunc(someArray:inout[Int]){
someArray.index.forEach{someArray[$0]=0}
}
func casettrue(someArray:inout[Int])->[Int]
{
//if语句的'true'分支中的附加代码
someFunc(&someArray)
返回数组
}
func caseflse(someArray:inout[Int])->[Int]{
//if语句的'false'分支中的附加代码
someFunc(&someArray)
返回数组
}
让someCase=true//只是为了编译一个具体的案例
//使用代码-假设在以后的代码中仍然需要arrayProxy
让arrayProxy=someCase?caseTrue(&sourceArray1):caseFalse(&sourceArray2)
打印(“sourceArray1=\(sourceArray1)”)
打印(“sourceArray2=\(sourceArray2)”)
caseTrue
caseFalse
可以是嵌套在包含
if
的方法中的本地函数,因此它们不会污染当前上下文之外的代码

类AClass
{
var sourceArray1=[1,2,3,4]
var sourceArray2=[5,6,7,8]
init(){}
func someFunc(someArray:inout[Int]){
someArray.index.forEach{someArray[$0]=0}
}
func-aMethod()
{
func casettrue(someArray:inout[Int])->[Int]
{
//if语句的'true'分支中的附加代码
someFunc(&someArray)
返回数组
}
func caseflse(someArray:inout[Int])->[Int]{
//if语句的'false'分支中的附加代码
someFunc(&someArray)
返回数组
}
让someCase=true//只是为了编译一个具体的案例
//使用代码-假设在以后的代码中仍然需要arrayProxy
设arrayProxy=someCase?caseTrue(&sourceArray1):caseFalse(&sourceArray2)
打印(“sourceArray1=\(sourceArray1)”)
打印(“sourceArray2=\(sourceArray2)”)
}
}

如果
caseTrue
caseFalse
的主体依赖于
aMethod
中的局部变量,则这不是问题。局部函数从周围的上下文中捕获变量,就像闭包一样(事实上,在Swift中,它们基本上只是命名为闭包)。因此,在您需要调用函数之前声明函数,这意味着在
aMethod

中可能有一些代码在它们上面,显然我最初对这个问题的理解是模糊的,因此,在更新了(希望是准确的)理解之后,我将通过给出具体的(可编译的)代码来重新表达这个问题我认为OP想要做什么的代码,然后给出我的解决方案

我重新命名了一些东西,使之更具体,并在代码中表达它们的角色。给定如下代码:

var sourceArray1=[1,2,3,4]
var sourceArray2=[5,6,7,8]
func someFunc(someArray:inout[Int]){
someArray.index.forEach{someArray[$0]=0}
}
让someCase=true//只是为了编译一个具体的案例
//使用代码
变量arrayProxy:[Int]
万一{
arrayProxy=sourceArray1
//一些可能涉及或可能不涉及arrayProxy的附加代码
}否则{
arrayProxy=sourceArray2
//一些可能涉及或可能不涉及arrayProxy的附加代码
}
someFunc(&arrayProxy)
打印(“sourceArray1=\(sourceArray1)”)
打印(“sourceArray2=\(sourceArray2)”)
实际输出为

sourceArray1 = [1, 2, 3, 4]
sourceArray2 = [5, 6, 7, 8]
sourceArray1 = [0, 0, 0, 0]
sourceArray2 = [5, 6, 7, 8]
但是期望的输出是

sourceArray1 = [1, 2, 3, 4]
sourceArray2 = [5, 6, 7, 8]
sourceArray1 = [0, 0, 0, 0]
sourceArray2 = [5, 6, 7, 8]
因此,
if
语句选择的源数组是要更改的数组,而
arrayProxy
语句可能会在以后使用