【问题标题】:Generic Addition Function Swift通用加法函数 Swift
【发布时间】:2022-05-17 13:20:11
【问题描述】:

我想创建一个可以接受两个参数的函数,并根据输入的类型执行二进制运算(例如,'int' 简单加法,对于字符串,它应该连接等)并返回结果。对于以下方法,我收到诸如“二进制运算符‘+’不能应用于两个‘T’操作数”之类的错误

func commonAdd <T>(paramA:T,paramB:T)->T

【问题讨论】:

  • 假设我传递给函数 2 UIButton(s),结果应该是什么?
  • 应该有一些方法来定义所有新类型输入的功能
  • 所以你想为 Swift 支持的每一个 可能的类型定义一个规则?我的意思是 every Apple 框架和 every 第三方库中的 every 类型?你确定吗?
  • 泛型概念涵盖的范围是什么
  • 问题在于,使用此签名func commonAdd &lt;T&gt;(paramA:T,paramB:T)-&gt;T,您可以保证给定两个相同类型的输入,您将能够对它们求和。但这是不可能的,因为我可以定义我自己的类型struct Foo { }(当然)不会由你的代码管理。

标签: swift generics


【解决方案1】:

一种可能的方法。

1) 可添加协议

您定义了一个Addable 协议。

protocol Addable {
    func add(other:Self) -> Self
}

2) commonAdd 函数

接下来你定义你的功能这种方式

func commonAdd <T: Addable>(paramA:T,paramB:T) -> T {
    return paramA.add(paramB)
}

3) 使 Int 符合 Addable

接下来选择一个类型并使其符合Addable

extension Int: Addable {
    func add(other: Int) -> Int {
        return self + other
    }
}

4) 用法

现在您可以将您的函数与Int 一起使用。

commonAdd(1, paramB: 2) // 3

更多

您应该重复第 3 步,使 Addable 成为您要在函数中使用的每个类型。

【讨论】:

    【解决方案2】:

    符合 AdditiveArithmetic 添加通用数据类型的协议。

    func commonAdd<T: AdditiveArithmetic>(paramA:T,paramB:T) ->T{
        return item1 + item2
      }
    

    如果您需要支持字符串,请使其符合 AdditiveArithmetic,但您还需要实现减法:

    extension String: AdditiveArithmetic {
        public static func -= (lhs: inout String, rhs: String) {
                var set = Set(rhs)
            lhs.removeAll{ !set.insert($0).inserted }
        }
        public static func - (lhs: String, rhs: String) -> String {
            var set = Set(rhs)
            return lhs.filter{set.insert($0).inserted}
        }
        public static var zero: String { "" }
    }
    

    【讨论】:

      【解决方案3】:

      要添加的通用函数(Int、Double、String)

      func add<T: Any >(itemA: T, itemB: T) -> T {
      
          if itemA is Int && itemB is Int {
              debugPrint("Int")
              let intNum1 = itemA as! Int
              let intNum2 = itemB as! Int
              return intNum1 + intNum2 as! T
              
          } else if itemA is Double && itemB is Double {
              debugPrint("Double")
              let doubleNum1 = itemA as! Double
              let doubleNum2 = itemB as! Double
              return doubleNum1 + doubleNum2 as! T
          } else {
              debugPrint("String")
              let string1 = itemA as! String
              let string2 = itemB as! String
              return string1 + string2 as! T
              
          }
          
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 2017-07-24
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        相关资源
        最近更新 更多