Ios 协议中的静态变量

Ios 协议中的静态变量,ios,swift,Ios,Swift,我有一个协议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) } 在类C中a是一个属性,该属性保

我有一个协议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)
}

类C中
a是一个属性,该属性保存符合
协议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

static
变量属于类,而不是实例。您可以通过调用
dynamicType
来引用该类:

print(a.dynamicType.x)

所以,自从这个答案发布后,情况发生了一些变化

type(of: a).x

x
作为
静态var
是否有特殊原因?在这种情况下,您不需要静态变量。基本上,您的问题是您试图通过类的实例访问一个
静态
aka类关联变量。删除
static
要求,您就可以开始了。它是静态的,因为在某些情况下我需要执行B.x,但在另一种情况下我不能执行,因为A可以有多个实现。如果您有时需要执行
B.x
,有时需要执行
A
特定的实现,那么你真的应该考虑把这两个问题分开。因为,当您执行
B.x
时,您并不是真正访问
a
属性,而是直接访问类B上的
x
属性。它是静态的,因为在某些情况下,我需要执行B.x(其中我有一个强大的一对一连接)但在另一种情况下,我不能这样做,因为一个类可以有多个实现。所以它可以被称为实例和类变量。答案很好,但需要创建静态变量和实例变量。请按不同的代码查看答案。是的,在看到不同的代码后,它单击了您的答案。如何将默认值分配给x,以便不必包含在a的每个实现中?使用getter访问另一个具有默认值的变量?@2ank3th使用