2017-07-21 61 views
-1

這對你來說是一個非常愚蠢的問題Swift專家:我如何訪問不同函數中的類的內部變量?這裏有一個例子:在不同函數中訪問內部變量

class SomeClass { 
    var vc: NSString? 
    internal func defVC() { 
    if let vc = "hi" as? NSString { 
     println("Successfully defined vc as \(vc)") 
    } 
    } 
    internal func whatsVC() { 
    println(vc) 
    } 
} 
let hmm = SomeClass() 
hmm.defVC() // 'Successfully defined vc as hi' 
hmm.whatsVC() // 'nil' 

我希望VC已經被定義爲「喜」的類hmm,但事實並非如此。我可以做些什麼修改,以便vc只能在類實例中訪問,但是可以訪問該類實例中的所有內部函數?

謝謝!

+0

如何可以在編譯器讓你通'如果讓vc =「hi」'? –

+0

對不起,這是'「嗨」? NSString'。我會解決它! – mineralwasser

+1

這個「修復」不會改變任何東西。你永遠不會爲你的'vc'屬性賦值。你只給一個名爲'vc'的局部變量賦值。 – rmaddy

回答

2

因爲你沒有任何值分配給vc屬性:

if let vc = "hi" as? NSString { 
    // vc is a local variable of type NSString 
    // you need to set the value for vc the instance property 
    self.vc = vc 
} 

此外,你應該使用雨燕的本地String,不ObjC的NSString,除非你有一個很好的理由不這樣做。

+0

非常感謝。我會盡快將它作爲正確答案進行檢查。 – mineralwasser

+0

我實際上正在試圖在Swift項目中實現一個用ObjC編寫的SDK(我不知道任何其他內容) – mineralwasser

+0

'NSString'屬性會自動橋接到Swift中的'String'中。通過按住Option並點擊'instance'屬性來更好地檢查'vc'的類型是什麼,然後點擊'instance'屬性 –

0

var vc: NSString? & if let vc = "hi" as? NSString

兩個vc是不同的變量,並佔據不同的存儲位置。 if let總是創建一個新的變量,它自己的範圍(從if to {})。

在您的代碼中:
var vc: NSString?被聲明爲可選字符串,但從未分配過內存/值。
儘管在if語句,它創造了新的常量變量,不能存儲/值分配給var vc: NSString?

if let vc = "hi" as? NSString { 
     println("Successfully defined vc as \(vc)") 
} // ends scope of `vc` declared with if statement 

試試這個,看看:

class SomeClass { 
    var vc: NSString? 
    internal func defVC() { 
    if let vc = "hi" as? NSString { 
     self.vc = vc 
     println("vc = \(vc)") // result - vc = hi 
     println("self.vc = \(self.vc)") // result - vc = optional(hi) 
    } 
    } 
    internal func whatsVC() { 
    println(vc) 
    } 
} 
let hmm = SomeClass() 
hmm.defVC() // result - vc = hi 
hmm.whatsVC() // result - vc = optional(hi) 
+0

這非常清楚!非常感謝! – mineralwasser

相關問題