2016-03-18 45 views
0

我有一個協議A,它有一個靜態變量x。 B是A的實現。在C類中,我傳遞B的一個實例並將其分配給a。我如何從中訪問2(B類中的x的值)?協議中的靜態變量

protocol A { 
static var x : Int { get } 
} 

class B : A { 
static var x: Int { 
    return 2 
} 
} 


class C { 
// instance of B is assigned to a. 
let a: A 


print(a.x) 
} 
+0

是否有將'x'作爲'static var'的特殊原因? – damirstuhec

+0

在這種情況下,你不需要靜態。基本上,你的問題是,你試圖通過該類的一個實例訪問一個「靜態」(也就是類相關變量)。刪除「靜態」要求,你很好去。 – damirstuhec

+0

它是靜態的,因爲在某些情況下,我需要做B.x,但在其他情況下,我不能這樣做,因爲A可以有多個實現。 – 2ank3th

回答

3

static可變屬於而不是實例。你可以通過調用dynamicType來引用該類:

print(a.dynamicType.x) 
+0

很好的答案,你已經破譯了這個問題 – sketchyTech

+0

這是很好的解決方案。謝謝:) – 2ank3th

+0

我該如何爲x指定一個默認值,以便我不必在每個A的實現中都包含? – 2ank3th

1

class C一個是持有型秉承protocol A實例的屬性。然而,一個靜態變量(也稱爲類變量)是不是從一個實例訪問,它是從類訪問,所以你會以下列方式訪問該值:

B.x 

一個實例變量將是一個不同的問題,併爲這個代碼將是:

protocol A { 
    var x : Int { get } 
} 

class B : A { 
    var x: Int { 
     return 2 
    } 
} 


class C { 
    // instance of B is assigned to a. 
    let a: A 
    init() { 
     a = B() 
    } 

} 

C().a.x 

這些可以愉快地使用相同的變量名並存:

protocol A { 
    static var x : Int { get } 
    var x : Int { get } 
} 

class B : A { 
    static var x: Int { 
     return 2 
    } 
    var x: Int { 
     return 2 
    } 
} 


class C { 
    // instance of B is assigned to a. 
    let a: A 
    init() { 
     a = B() 
    } 

} 

C().a.x 
B.x 
+0

它是靜態的,因爲在某些情況下,我需要做B.x(我有強大的一對一連接),但在其他情況下,我不能這樣做,因爲A可以有多個實現。 – 2ank3th

+0

查看我添加的最後一段代碼,其中類和實例變量共享相同的名稱。這樣它可以被稱爲實例和類變量。 – sketchyTech

+0

你的答案很好,但它需要創建靜態和實例變量。請看代碼不同的答案。 – 2ank3th