swift 协议中的静态变量

eoigrqb6  于 2023-03-28  发布在  Swift
关注(0)|答案(4)|浏览(190)

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

hmtdttj41#

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

print(a.dynamicType.x)
cu6pst1q

cu6pst1q2#

所以自从这个答案贴出来之后,事情发生了一点点变化

type(of: a).x
0sgqnhkj

0sgqnhkj3#

class C中,a是一个属性,它保存了一个遵循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
gwbalxhn

gwbalxhn4#

我遇到过类似的问题,我有一个带有静态字段的协议,我希望能够从协议的通用示例访问该静态字段。
我的解决方案是用我想要的行为创建一个协议的扩展:

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

相关问题