有沒有辦法在下面的一段代碼中修改unknown
的x
屬性?如何修改鍵入的結構對象任何在Swift中?
struct S {
var x = 3
}
var s = S()
var unknown: Any = s
unknown
是任何類型和s
副本。雖然x
的s
可以通過類似s.x = 4
的東西修改,那麼如何修改x
的unknown
?
有沒有辦法在下面的一段代碼中修改unknown
的x
屬性?如何修改鍵入的結構對象任何在Swift中?
struct S {
var x = 3
}
var s = S()
var unknown: Any = s
unknown
是任何類型和s
副本。雖然x
的s
可以通過類似s.x = 4
的東西修改,那麼如何修改x
的unknown
?
在這一點上,我認爲修改x
的unknown
直接是不可能在Swift中,它不一定是。畢竟,類型爲Any
的struct對象總是另一個對象的副本,似乎沒有必要修改這樣的副本的內部,因爲這樣做不會修改原始副本。
我會將此帖標記爲我的問題的答案,以便將來的讀者能夠清楚地瞭解情況,但我也會對所有值得考慮的答案進行投票。
做一個類型轉換: (未知爲S).X = 4
這樣做是錯誤。 「不能分配給'Int'類型的不可變表達式」 – candleindark
我不知道這樣的錯誤。試試?而不是作爲 – Sandro
我試過'(未知爲?S)!. x = 4'。它會產生相同的錯誤。 – candleindark
您可以使用條件綁定:
if var s = unknown as? S {
s.x = 4
unknown = s
}
else {
print("unknown is not an S")
}
這不完全是我想要的。我想找到一種方法來改變'未知'對象中的'x'。上面的代碼只會改變一個'unknown',而不是'unknown'本身的副本。 – candleindark
啊,是的,我錯過了一個步驟:重新分配's'回到'未知'。 – Alexander
有沒有辦法直接修改'unknown',而不是分配另一個值? – candleindark
沒有指定一個用例,但唯一的原因我能想到的是,如果你想能夠分配多個不同的結構到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
所需的性能,但它是我能想到的做到這一點,而無需使用一個類的唯一途徑。
你的代碼不是很有意義。如果你知道'unknown'是's'的副本,那麼你知道類型和顯式(不必要的)類型註釋會導致問題。 – vadian
你可以使用'as''來形容它。不知爲? S' – Rahul
@vadian不,我的代碼確實不是非常有用,因爲它沒有任何實際用途。我寫信給代碼,以便我可以在Swift中提出一個問題。我想知道是否可以在鍵入Any時更改結構對象的屬性。 – candleindark