2016-07-24 62 views
-1

我正在使用Swift 2,并且我想将struct类型与enum中的每个个案相关联。将类型与Swift枚举类型关联起来?

目前,我已经通过向枚举添加一个函数来解决此问题,该函数名为type,它使用switch语句为每个案例返回相关类型的实例,但是我想知道是否有必要。我知道你可以将字符串,整数等与Swift枚举关联起来,但是也可以关联一个类型吗?如果有帮助,所有类型的结构都符合相同的协议。

这就是我现在正在做什么,但我喜欢这个功能做掉:

public enum Thingy { 

    case FirstThingy 
    case SecondThingy 

    func type() -> ThingyType { 
     switch self { 
     case .FirstThingy: 
      return FirstType() 
     case .SecondThingy: 
      return SecondType() 
     } 
    } 

} 
+1

“这就是我现在正在做的事情,但我很想去除这个功能”为什么?你在做什么使得选择完美。它将类型与案例联系起来!这是一个枚举方法_for_。我建议你保持你的想法并继续前进。 – matt

+0

我当然可以,但我知道用一个字符串等,我可以简单地做'case FirstThingy =“FirstThingy”'。我想知道我们是否有办法用对象来做到这一点。 – Luke

+1

所以你说你想要这个类型是一个原始值?保持这一点,或更好的是,使其成为一个计算属性。然后,你可以使用'thingy.type'而不是'thingy.rawValue'。 – tktsubota

回答

1

我想你说你想要的原始值是ThingyType类型,但这是不可能的。

你可以做的是使type一个计算属性,以删除()和只需要访问它与thingy.type

public enum Thingy { 

    case FirstThingy 
    case SecondThingy 

    var type: ThingyType { 
     switch self { 
     case .FirstThingy: 
      return FirstType() 
     case .SecondThingy: 
      return SecondType() 
     } 
    } 

} 
+0

这不是一个可读的问题。 ThingyType没有资格成为原始价值。我不明白这个答案是如何超越OP的原始代码的。 – matt

+0

@matt我删除了可读性部分,并补充说它不可能是原始值。这比'方式'更好,因为“类型”通常是属性。 “Thingy”有一个类型,而不是“Thingy”有一个确定自己类型的方法。 – tktsubota

+0

OP的问题是“我很想取消这个功能”。但是你没有(也不能)“干掉”任何东西。计算属性中的大括号内的东西是一个函数(它是'get'函数,getter函数,除了通过省略单词'get'来伪装这个函数)。这是OP表示他希望取消的同一功能!所以这个“答案”不过是一种手法 - 尽管足以满足OP,我知道...... – matt