2017-04-18 60 views
1

有沒有辦法在下面的一段代碼中修改unknownx屬性?如何修改鍵入的結構對象任何在Swift中?

struct S { 
    var x = 3 
} 

var s = S() 

var unknown: Any = s 

unknown是任何類型和s副本。雖然xs可以通過類似s.x = 4的東西修改,那麼如何修改xunknown

+0

你的代碼不是很有意義。如果你知道'unknown'是's'的副本,那麼你知道類型和顯式(不必要的)類型註釋會導致問題。 – vadian

+0

你可以使用'as''來形容它。不知爲? S' – Rahul

+0

@vadian不,我的代碼確實不是非常有用,因爲它沒有任何實際用途。我寫信給代碼,以便我可以在Swift中提出一個問題。我想知道是否可以在鍵入Any時更改結構對象的屬性。 – candleindark

回答

0

在這一點上,我認爲修改xunknown直接是不可能在Swift中,它不一定是。畢竟,類型爲Any的struct對象總是另一個對象的副本,似乎沒有必要修改這樣的副本的內部,因爲這樣做不會修改原始副本。

我會將此帖標記爲我的問題的答案,以便將來的讀者能夠清楚地瞭解情況,但我也會對所有值得考慮的答案進行投票。

0

做一個類型轉換: (未知爲S).X = 4

+0

這樣做是錯誤。 「不能分配給'Int'類型的不可變表達式」 – candleindark

+0

我不知道這樣的錯誤。試試?而不是作爲 – Sandro

+0

我試過'(未知爲?S)!. x = 4'。它會產生相同的錯誤。 – candleindark

3

您可以使用條件綁定:

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

這不完全是我想要的。我想找到一種方法來改變'未知'對象中的'x'。上面的代碼只會改變一個'unknown',而不是'unknown'本身的副本。 – candleindark

+0

啊,是的,我錯過了一個步驟:重新分配's'回到'未知'。 – Alexander

+0

有沒有辦法直接修改'unknown',而不是分配另一個值? – candleindark

1

沒有指定一個用例,但唯一的原因我能想到的是,如果你想能夠分配多個不同的結構到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所需的性能,但它是我能想到的做到這一點,而無需使用一個類的唯一途徑。