【问题标题】:A Switch With A String Enum Is Not Being Recoginized无法识别带有字符串枚举的开关
【发布时间】:2014-10-15 16:43:54
【问题描述】:

我有一个 CIFilter 我想做一些效果。我有一个字符串类型的枚举

enum FilterType:String{
        case Sepiatone = "CISepiatone"
        case FalseColor = "CIFalseColor"
    }

但是如果我尝试下面的代码,枚举不会被视为字符串

 private class func createFilter(inout filter:CIFilter!,filterName:FilterType)
    {
        switch filterName{
        case .Sepiatone:
            filter = CIFilter(name: filterName) //ERROR "Extra argument 'name' in call
        default:
            println("Filter name is not a match")
        }
    }

错误消息意味着它没有将我的枚举类型视为字符串,因此认为我使用了错误的 init。

你知道我的 switch 语句有什么问题吗?

【问题讨论】:

    标签: ios xcode swift enums switch-statement


    【解决方案1】:

    您必须使用 rawValue 属性从枚举中获取原始值:

    filter = CIFilter(name: filterName.rawValue)
    

    为了完整起见,类似地,您可以使用初始化程序从原始值获取枚举案例:

    var filterType = FilterType(rawValue: "CISepiatone")
    

    附录:我认为您在 filterName() 方法中使用了不必要的开关。如果FilterType 枚举仅包含有效过滤器,则FilterType 类型的变量不能包含不是其中之一的值。所以在我看来,这个实现应该可以工作:

    private class func createFilter(inout filter:CIFilter!,filterName:FilterType)
    {
        filter = CIFilter(name: filterName.rawValue)
    }
    

    此外,不建议使用参数作为返回值,除非你有充分的理由——你可以让函数返回过滤器:

    func createFilter(filterName:FilterType) -> CIFilter
    {
        return CIFilter(name: filterName.rawValue)
    }
    

    最后,你可以去掉那个函数并添加一个CIImage 扩展:

    extension CIFilter {
        convenience init (filterType: FilterType) {
            self.init(name: filterType.rawValue)
        }
    }
    
    let filterType = FilterType.FalseColor
    let filter = CIFilter(filterType: filterType)
    

    这不是更简单吗?


    注意:如果您像我一样使用 Xcode 6.0.x,请将 filterName.rawValue 替换为 filterName.toRaw() 并将 FilterType(rawValue: filterName) 替换为 FilterType.fromRaw(filterName)

    【讨论】:

    • 旁注:在 Xcode 6.1 中,toRaw()fromRaw() 已被属性和构造函数替换,请参阅 stackoverflow.com/questions/25919075/…
    • 我仍在使用 6.0.1 - 但感谢您,我正在相应地更新我的答案
    • 很好的答案,谢谢。关于返回类型,是的,我通常会这样做。但是,我创建了一组称为“处理器”的类,它们的工作是获取一个对象并对其进行变异。所以对我来说,我将图像传递给它似乎是合乎逻辑的,处理器会对其进行变异。或者您会建议其他方式吗?
    • 不,我没有任何建议,因为没有正确了解您的处理器的功能。但这看起来是拥有具有该签名的方法的一个很好的理由。
    • 我喜欢 Stack 社区的帮助!让每一个答案都很重要,我喜欢它!
    猜你喜欢
    • 2017-05-18
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多