如何修改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