Generics 在Swift中,能否将泛型约束为两种类型?字符串和Int

Generics 在Swift中,能否将泛型约束为两种类型?字符串和Int,generics,swift3,extension-methods,Generics,Swift3,Extension Methods,在Swift3中,你能做到这一点吗 func example<T>()->(T) where T can only be String or Int func example()->(T),其中T只能是字符串或Int 或者,你只需要有两个分机吗 例如,该函数计算一个数学函数 输入在概念上是一个“数字”,但它可以是法语的字符串,也可以是整数。因此,输入可以是字符串“cent”或Int 100。结果是平方根,所以字符串“dix”或Int 10。这不是泛型的工作。使用两种类型的

在Swift3中,你能做到这一点吗

 func example<T>()->(T) where T can only be String or Int
func example()->(T),其中T只能是字符串或Int
或者,你只需要有两个分机吗

例如,该函数计算一个数学函数


输入在概念上是一个“数字”,但它可以是法语的字符串,也可以是整数。因此,输入可以是字符串“cent”或Int 100。结果是平方根,所以字符串“dix”或Int 10。

这不是泛型的工作。使用两种类型的静态集没有什么通用性

这是使用枚举的最佳情况:

enum SomeEnum { //TODO: name me
    case string(String)
    case int(Int)
}

func foo(input: SomeEnum) -> SomeEnum {
    switch input {
        case .string(let s):
            print("This is a String: \(s)")
            return(.string("abc"))
        case .int(let i):
            print("This is an Int: \(i)")
            return(.int(123))
    }
}

print(foo(input: SomeEnum.string("qwerty")))
print(foo(input: SomeEnum.int(5)))

我是这样想的,尽管枚举似乎是一个很好的答案

protocol HasSquareRootMethod {
    var squareRoot: Int { get }
}
extension Int {
    var squareRoot: Int { return 0 }
}
extension String {
    var squareRoot: Int { return 0 }
}

其他答案演示了如何在一般情况下创建约束为两个或多个其他不相关类型的泛型函数。如果你的问题真的是关于这个一般性问题,那你就可以走了

然而,如果您提供的示例用例类似于您实际想要做的事情,那么使用泛型可能不是您想要的

输入在概念上是一个“数字”,但它可以是法语的字符串,也可以是整数。因此,输入可以是字符串“cent”或Int 100。结果是平方根,所以字符串“dix”或Int 10

这意味着您实际上(至少)有两个问题()

  • 将用户输入文本转换为数字类型

    (您的最终类型可能是
    Float
    Double
    ,因为标准库中的
    Int
    上没有定义平方根之类的超越函数。还要注意,即使用户输入为“数字”,您也必须这样做。)--也就是说,一个包含数字的字符串--因为该字符串可以包含其他字符,这些字符可能会或可能不会影响其作为数字的“含义”。)

  • 求出数字的平方根

  • (可选,可能是也可能不是您的完整设计的一部分。)以友好、易读的格式给出答案,可能与用户输入的格式类似

  • 第二步很简单,只要你有一个数字。对于步骤1和3,您至少可以从以下内容开始:

    设置
    formatter.locale=locale(标识符:“ja_JP”)
    您将获得“十" 为了“百,使用
    fr\u fr
    fr\u CA
    ,“cent”变为“dix”,等等

    然而,解释用户文本总是很混乱。如果他们输入的是“一百二十一”而不是“一百二十一”,那该怎么办?如果有其他无关字符呢?
    numberformatter
    无法识别整个可能的自然语言数值表达式

    您在处理和输出时也需要考虑一些逻辑。如果用户输入的数字没有整数平方根,会发生什么?您真的想在UI中显示“十点零四九八七五六二一一二零九”吗


    像这样的大而复杂的问题是一个很好的理由,可以将程序中的不同任务分解开来,而不是通过一个通用函数运行所有逻辑。(还有一些简单的理由,比如可以将数字/文本转换代码重新用于多个数学运算。)

    我们可以像下面这样声明泛型,还提供了示例用法,请检查

     func genericTest<T>(_ a: inout T,  _ b: inout T)
    {
     let c = a
      a = b
       b = c
      }
      var a = 10
           var b = 20
           genericTest(&b, &a)
           print("av:\(a)---\(b)")
    
           var c = "myTest"
           var d = "new Test"
           genericTest(&c, &d)
           print("cv:\(c)---\(d)")
    
    func-genericTest(a:inout T,b:inout T)
    {
    设c=a
    a=b
    b=c
    }
    变量a=10
    var b=20
    通用测试(&b和&a)
    打印(“av:\(a)--\(b)”)
    var c=“myTest”
    var d=“新测试”
    通用测试(c&d)
    打印(“简历:\(c)-\(d)”)
    
    这不是泛型的工作,因为使用
    String
    Int
    专门创建一个枚举来存储各种可能性没有任何泛型。您返回的值不是问题,而是您希望不约束的有限静态类型集的问题。您的数学函数不应该运行在多个表示中,这将是不明智的将您的输入解析为
    Int
    Double
    ,或其他一些普通数据类型,处理常规数据,然后以正确的格式生成输出hi@AlexanderMomchliov,在Swift3中,是否有泛型语法,即“类型T必须是String或Int“。你知道吗?这是一个很棒的枚举示例,谢谢。在Swift3中,有人知道泛型有语法吗?泛型的意思是“类型T必须是字符串或Int”?它可能有点迂回,但您可以使用类型约束来强制执行它吗@Alex是的,但它没有列举出来那么有表现力Hi@rickster,谢谢你的扩展答案。实际上,“法语ints”的例子只是一个例子。一个简单的使用示例可能是,如果可选值为null,则返回一个“合理值”(“0”表示字符串,0表示int,0.0表示float..随便什么)。您的答案如何解决这个问题?
     func genericTest<T>(_ a: inout T,  _ b: inout T)
    {
     let c = a
      a = b
       b = c
      }
      var a = 10
           var b = 20
           genericTest(&b, &a)
           print("av:\(a)---\(b)")
    
           var c = "myTest"
           var d = "new Test"
           genericTest(&c, &d)
           print("cv:\(c)---\(d)")