gpt4 book ai didi

ios - 从基类或协议(protocol)继承的静态字段 - 如何?

转载 作者:搜寻专家 更新时间:2023-10-31 08:23:47 30 4
gpt4 key购买 nike

我希望能够拥有具有静态属性(字段)的类,该属性是从基类继承或从协议(protocol)“混合”。每个类都应该有它自己的该属性的实现。可能吗?最好是不可变的。

class C1 {
static let stProperty = "my prorepty1"
}

class C2 {
static let stProperty = "my prorepty2"
}

最佳答案

这是可能的,但要让它在 Swift 中发挥作用真的很难。您打算如何引用此属性?让我们从一个 super 简单的实现开始:

protocol SomeProtocol {
static var prop: String { get }
}

class C1: SomeProtocol {
static let prop = "This is One"
}

太棒了。所以现在我想要一个使用这个的函数:

func useProp(x: SomeProtocol) -> String {
return x.prop
// 'SomeProtocol' does not have a member named 'prop'
}

那是行不通的。 x 是一个实例,但我想要类型。

// Accessing members of protocol type value 'SomeProtocol.Type' is unimplemented
func useProp(x: SomeProtocol.Type) -> String {
return x.prop
}

鉴于“未实现”这个词,这可能是某天它 的工作方式。但它今天不起作用。

func useProp(x: SomeProtocol) -> String {
// Accessing members of protocol type value 'SomeProtocol.Type' is unimplemented
return x.dynamicType.prop
}

同样的事情。

今天,你真的必须把它卡在对象本身上,而不是使用 staticclass:

protocol SomeProtocol {
var prop: String { get }
}

class C1: SomeProtocol {
let prop = "This is One"
}

func useProp(x: SomeProtocol) -> String {
return x.prop
}

在很多情况下这并不可怕,因为类的值可能也是类的任何给定实例的值。这真的是我们今天所能做的。

当然,您的问题可能是您还没有实例,而您需要此信息来构建实例。今天这真的很难,您可能应该重新考虑您的设计。您通常必须使用一些其他模式,例如 Builder。参见 Generic Types Collection了解更多。

现在你还说:

or "mixed" from a protocol

我不会在这里说“混合”。如果你的意思真的像 Ruby 的“mixin”,那么今天的 Swift 中没有这样的东西。 Swift 开发人员经常将此功能称为“默认实现”,目前还不可能实现(尽管我确实希望它最终会实现)。您在协议(protocol)中唯一可以做的就是说实现者必须以某种方式提供此方法。你不能为他们提供。

关于ios - 从基类或协议(protocol)继承的静态字段 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29030953/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com