如何修改Swift中键入的结构对象?

如何修改Swift中键入的结构对象?,swift,struct,Swift,Struct,是否有方法修改以下代码段中unknown的x属性 struct S { var x = 3 } var s = S() var unknown: Any = s unknown的类型为Any,并且是s的副本。虽然s的x可以被s.x=4这样的东西修改,但是如何修改未知的x?进行类型转换: (未知为S)。x=4进行类型转换: (未知为S)。x=4您可以使用条件绑定: if var s = unknown as? S { s.x = 4 unknown = s } els

是否有方法修改以下代码段中
unknown
x
属性

struct S {
    var x = 3
}

var s = S()

var unknown: Any = s
unknown
的类型为Any,并且是
s
的副本。虽然
s
x
可以被
s.x=4
这样的东西修改,但是如何修改
未知的
x

进行类型转换: (未知为S)。x=4进行类型转换:
(未知为S)。x=4

您可以使用条件绑定:

if var s = unknown as? S {
    s.x = 4
    unknown = s
}
else {
    print("unknown is not an S")
}

您可以使用条件绑定:

if var s = unknown as? S {
    s.x = 4
    unknown = s
}
else {
    print("unknown is not an S")
}

您没有指定用例,但我能想到的唯一原因是,如果您希望能够将多个不同的结构分配给
unknown
。在这种情况下,协议可能会满足您的需要:

protocol HasX {
    var x: Int {get set}
}

struct S: HasX {
    var x = 3
}

var s = S()

var unknown: HasX = s

unknown.x = 4 // no error

这将限制您仅使用
HasX
所需的属性,但这是我能想到的不使用类来实现这一点的唯一方法。

您没有指定用例,但我能想到的唯一原因是如果您希望能够将多个不同的结构分配给
未知的
。在这种情况下,协议可能会满足您的需要:

protocol HasX {
    var x: Int {get set}
}

struct S: HasX {
    var x = 3
}

var s = S()

var unknown: HasX = s

unknown.x = 4 // no error

这将限制您仅使用
HasX
所需的属性,但这是我能想到的不使用类来实现这一点的唯一方法。

在这一点上,我认为直接修改
unknown
x
在Swift中是不可能的,也不必这样做。毕竟,类型为
Any
的结构对象始终是另一个对象的副本,似乎没有必要修改这样一个副本的内部,因为这样做不会修改原始对象


我将把这篇文章标记为我问题的答案,以便未来的读者能够清楚地了解情况,但我也将投票选出所有值得考虑的答案。

在这一点上,我认为直接修改
未知的
x
在Swift中是不可能的,也不必如此。毕竟,类型为
Any
的结构对象始终是另一个对象的副本,似乎没有必要修改这样一个副本的内部,因为这样做不会修改原始对象



我会将这篇文章标记为我问题的答案,以便将来的读者能够清楚地了解情况,但我也会对所有值得考虑的答案进行投票。

您的代码不是很有意义。如果您知道
unknown
s
的副本,则您知道类型和显式(不必要的)类型注释会导致问题。您可以使用
as
对其进行类型转换,例如
unknown as?不,我的代码确实不是很有用,因为它实际上没有任何实际用途。我写信给代码,这样我就可以用Swift提问了。我想知道当struct对象类型为Any时,我是否可以更改它的属性。您的代码不是很有意义。如果您知道
unknown
s
的副本,则您知道类型和显式(不必要的)类型注释会导致问题。您可以使用
as
对其进行类型转换,例如
unknown as?不,我的代码确实不是很有用,因为它实际上没有任何实际用途。我写信给代码,这样我就可以用Swift提问了。我想知道我是否可以在struct对象类型为Any时更改它的属性。这并不是我想要的。我想找到一种方法来更改
unknown
对象中的
x
。上面的代码只更改了
unknown
的一个副本,而不是
unknown
本身。啊,是的,我错过了一个步骤:将
s
重新分配回
unknown
。有没有办法直接修改
unknown
,而不是分配另一个值?@candleindark我不这么认为,不。不过,这次调任很可能被省略了。不幸的是,不可能。它的属性不能作为
Any
访问,将其强制转换为
S
(不是副本)使其不可变。您必须使用类而不是结构来直接修改它。这不是我想要的。我想找到一种方法来更改
unknown
对象中的
x
。上面的代码只更改了
unknown
的一个副本,而不是
unknown
本身。啊,是的,我错过了一个步骤:将
s
重新分配回
unknown
。有没有办法直接修改
unknown
,而不是分配另一个值?@candleindark我不这么认为,不。不过,这次调任很可能被省略了。不幸的是,不可能。它的属性不能作为
Any
访问,将其强制转换为
S
(不是副本)使其不可变。您必须使用类而不是结构来直接修改它。这样做是错误的。“无法分配给'Int'类型的不可变表达式”我真的不知道这样的错误。试一试?而不是asI尝试了
(未知为?S)!。x=4
。它生成了相同的错误。我尝试了
(未知为!S)。x=4
。它也会产生同样的错误。最后一件可能有效的事情是(未知为?S)?。x=4这样做是一个错误。“无法分配给'Int'类型的不可变表达式”我真的不知道这样的错误。试一试?而不是asI尝试了
(未知为?S)!。x=4
。它生成了相同的错误。我尝试了
(未知为!S)。x=4
。它也会产生同样的错误。最后一个可能有效的方法是(未知为?S)?。x=4