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)
}
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
protocol A {
static var x: Int { get }
}
extension A {
var x: Int {
type(of: self).x
}
}
struct B: A {
static var x: Int { 2 }
}
struct C: A {
static var x: Int { 4 }
}
现在,您可以从示例上下文引用static var x,如下所示:
let instances: [any A] = [C(), B()]
instances.forEach { print($0.x) }
// prints 4 2
4条答案
按热度按时间hmtdttj41#
static
变量属于类,而不是示例。您可以通过调用dynamicType
来引用类:cu6pst1q2#
所以自从这个答案贴出来之后,事情发生了一点点变化
0sgqnhkj3#
在
class C
中,a是一个属性,它保存了一个遵循protocol A
的类型的示例。然而,静态变量(也称为类变量)不能从示例中访问,它可以从类中访问,因此您将通过以下方式访问值:一个示例变量将是一个不同的问题,其代码将是:
它们可以与相同的变量名愉快地共存:
gwbalxhn4#
我遇到过类似的问题,我有一个带有静态字段的协议,我希望能够从协议的通用示例访问该静态字段。
我的解决方案是用我想要的行为创建一个协议的扩展:
现在,您可以从示例上下文引用
static var x
,如下所示: