Swift枚举中的静态属性错误

Swift枚举中的静态属性错误,swift,Swift,我觉得我在围绕着一个答案跳舞,但还没有完全理解它——在类中有很多关于静态属性的伟大而有用的问题和答案,但是枚举在这里的行为似乎有点不同 如果我有 enum Dog: String { case Snoopy = "Snoopy" case Lassie = "Lassie" case Scooby = "Scooby" case Astro = "Astro" static let fromIndex = [ 0: Snoopy, 1: Lassie,

我觉得我在围绕着一个答案跳舞,但还没有完全理解它——在类中有很多关于静态属性的伟大而有用的问题和答案,但是枚举在这里的行为似乎有点不同

如果我有

enum Dog: String {
    case Snoopy = "Snoopy"
    case Lassie = "Lassie"
    case Scooby = "Scooby"
    case Astro = "Astro"

    static let fromIndex = [ 0: Snoopy, 1: Lassie, 2: Scooby, 3: Astro ]
    static let all = [ Snoopy, Lassie, Scooby, Astro ]
    static let count = all.count

    func indexValid( index: Int ) -> Bool {
        return 0 ... ( self.count - 1 ) ~= index ? true : false
    }
}
Dog.count在游乐场中给出了预期的4,但indexValid(1)抛出错误静态成员“count”不能用于类型为“Dog”的实例


我尝试过接受者和接受者以及其他类型的引用,但都没有成功。有没有办法在Swift的枚举中的函数中使用类似count的变量?

在常规方法中,如
indexValid
如果您引用
self
,它将引用实例

但是,在
静态
方法中,
self
引用类型(在本例中,指向
Dog
)而不是实例,因此您应该使用
Dog.count
,因为实例上没有名为
count
的属性,它位于类型
Dog
上,例如:

func indexValid( index: Int ) -> Bool {
    return 0 ... Dog.count ~= index ? true : false
}
你应该这样称呼它:

let dogInstance = Dog.Snoopy
dogInstance.indexValid(5)
或者,如果将
indexValid
设置为
static
,则可以使用原始版本,如:

static func indexValid( index: Int ) -> Bool {
    return 0 ... self.count ~= index ? true : false
}
在那之后,它将是:

Dog.indexValid(5)

在常规方法中,如
indexValid
,如果您引用
self
,它将引用实例

但是,在
静态
方法中,
self
引用类型(在本例中,指向
Dog
)而不是实例,因此您应该使用
Dog.count
,因为实例上没有名为
count
的属性,它位于类型
Dog
上,例如:

func indexValid( index: Int ) -> Bool {
    return 0 ... Dog.count ~= index ? true : false
}
你应该这样称呼它:

let dogInstance = Dog.Snoopy
dogInstance.indexValid(5)
或者,如果将
indexValid
设置为
static
,则可以使用原始版本,如:

static func indexValid( index: Int ) -> Bool {
    return 0 ... self.count ~= index ? true : false
}
在那之后,它将是:

Dog.indexValid(5)


这是我尝试过的事情之一,@DanielNagy,但它抛出了一个错误,无法将“Int”类型的值转换为预期的参数类型“Dog”有什么想法吗?这个错误在哪一行?在我的操场上,它编译得很好。在Dog.indexValid(1)@DanielNagy——枚举编译,但调用它会抛出错误。我更新了答案,您应该立即对实例调用
indexValid
,因为它不是静态方法。或者更改为
static func indexValid(..
您可以将原始版本与
self
一起使用。这是我尝试过的事情之一,@DanielNagy,但它抛出了错误,无法将类型为“Int”的值转换为预期的参数类型“Dog”,有什么想法吗?此错误在哪一行?在我的操场上它编译得很好。At Dog.indexValid(1)@DanielNagy--枚举可以编译,但调用它会引发错误。我更新了答案,您应该立即对实例调用
indexValid
,因为它不是静态方法。或者更改为
static func indexValid(..
您可以使用原始版本的
self
。除此之外,由于枚举案例始终是静态的,为什么要使用动态
count
属性?您知道有4个案例。当我将案例添加到枚举@vadian时,只需少维护一个地方。由于不必要的ste,它的性能也较低p、 假设你有数百个这样的东西只是为了你自己的方便…性能与维护是一个设计决策,取决于特定的规范。在这种情况下,我更担心维护。@DanielNagy提供了两个很好的解决方案。对于基于字符串的枚举,你不需要为名称与你指定的值匹配的情况赋值想要分配。在您的示例中,每个案例都是如此。除此之外,由于枚举案例始终是静态的,为什么要使用动态
count
属性?您知道有4个案例。当我将案例添加到枚举@vadian中时,只需少维护一个地方。由于不必要的步骤,它的性能也会降低。想象一下您为了您自己的方便,有数百个这样的东西……性能与维护是一个设计决策,取决于特定的规范。在这种情况下,我更担心维护。@DanielNagy提供了两个很好的解决方案。对于基于字符串的枚举,您不需要为名称与您要分配的值匹配的情况分配值.在你的例子中,每种情况都是如此。