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提供了两个很好的解决方案。对于基于字符串的枚举,您不需要为名称与您要分配的值匹配的情况分配值.在你的例子中,每种情况都是如此。