在swift中切换案例之后需要获得一个类吗?

时间:2017-09-29 16:46:01

标签: swift class switch-statement return any

我需要在swift的switch case之后将类作为响应,我得到了这个函数的编译问题。

func getOptClass(signal : String) -> AnyClass{

var result = AnyClass

switch(signal){
    case "IntRR":
        result = BPMClass.self
        break

    case "BPM":
        result = BPMClass.self
        break

    case "ECG":
        result = ECGClass.self
        break

    default:
        result = nil
        break
}
return result
}

这是错误:

    Swift Compiler Error Group
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:68:18: Expected member name or constructor call after type name
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:68:18: Use '.self' to reference the type object
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:72:22: Cannot assign value of type 'BPMClass.Type' to type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol')
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:76:22: Cannot assign value of type 'BPMClass.Type' to type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol')
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:80:22: Cannot assign value of type 'ECGClass.Type' to type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol')
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:84:22: Nil cannot be assigned to type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol')
/Users/gab/Desktop/desktopAppli/mobileApp/mobileApp/GlobalCstes.swift:87:12: Cannot convert return expression of type 'AnyClass.Protocol' (aka 'AnyObject.Type.Protocol') to return type 'AnyClass' (aka 'AnyObject.Type')

3 个答案:

答案 0 :(得分:2)

在你的情况下,我可能是一个返回表示你的类的泛型类型的函数。你可以尝试这样的事情:

func getOptClass<T>(signal : String) -> T {
switch(signal) {
    case "IntRR", "BPM":
      return T as! BPMClass
    case "ECG":
      return T as! ECGClass
    default:
      return nil
   }
}

此处T表示您创建的任何类型的任何类型。在每个开关案例中,我都会使用相应的类来转换此类型。只有在想要处理特定情况时,才需要像JAVA一样放置break语句。我也简化了你的开关,我认为它应该有效。

答案 1 :(得分:1)

您需要将结果声明为AnyClass,而不是将其值设置为:

var result: AnyClass!

然后添加你的switch语句。你不需要休息;他们不需要迅速;开始一个新的case语句将打破前一个,除非你添加fall through。

另外,你应该返回AnyClass ?,因为你有一个nil选项。

答案 2 :(得分:0)

func getOptClass(signal : String) -> AnyClass? {
    var result: AnyClass?

    switch(signal) {
    case "IntRR", "BPM":
        result = BPMClass.self
    case "ECG":
        result = ECGClass.self
    default:
        result = nil
    }

    return result
}

请注意,返回类型现在是可选的。这是你被允许返回零的唯一方式。