使用快速默认交换功能交换自定义类对象

问题描述

我想在Swift 5.0中使用默认的交换功能

这是我写的

swap(&buyingCurrencyObj,&sellingCurrencyObj)

其中

var sellingCurrencyObj = SellingCurrency()
var buyingCurrencyObj = BuyingCurrency()

但它说

Cannot convert value of type 'SellingCurrency' to expected argument type 'BuyingCurrency'

BuyingCurrency()和SellingCurrency()是我的两个类,它们的功能相同但具有不同的参数。

open class SellingCurrency {

public init() { }
    public var sellingCurrencyDisplayName:String?
    public var sellingCurrencyActive:Bool?
    public var sellingCurrencyCode:String?
    public var sellingCurrencyTradingPlatformID:String?
    public var sellingCurrencyID:String?
}

open class BuyingCurrency {
public init() { }
    public var buyingCurrencyDisplayName:String?
    public var buyingCurrencyActive:Bool?
    public var buyingCurrencyCode:String?
    public var buyingCurrencyTradingPlatformID:String?
    public var buyingCurrencyID:String?
}

我想交换这两个类对象。 如何在自定义类对象上使用默认的Swap函数。

谢谢。

解决方法

swap的输入参数的类型必须匹配。我建议创建一个通用的协议,两个类都要遵循该协议,然后将变量存储为协议。

protocol Currency {
    var displayName: String? { get }
    var active: Bool? { get }
    var currencyCode: String? { get }
    var tradingPlatformID: String? { get }
    var currencyID: String? { get }
}

open class SellingCurrency: Currency {
    public init() { }
    public var displayName: String?
    public var active: Bool?
    public var currencyCode: String?
    public var tradingPlatformID: String?
    public var currencyID: String?
}

open class BuyingCurrency: Currency {
    public init() { }
    public var displayName: String?
    public var active: Bool?
    public var currencyCode: String?
    public var tradingPlatformID: String?
    public var currencyID: String?
}

var buyingCurrency: Currency = BuyingCurrency()
var sellingCurrency: Currency = SellingCurrency()

swap(&buyingCurrency,&sellingCurrency)

对代码的一些一般改进:

  • 使用类型名称为变量名加上前缀不会增加任何值,但会使可读性大大降低,因此我强烈建议您不要这样做。
  • 具有类型Optional的所有属性通常是一种繁琐的代码气味-仅使属性Optional确实需要Optional
,

由于SellingCurrencyBuyingCurrency都具有相同类型的数据,因此您可以简单地创建一个分别代表它们的单个class,而不必使用2种单独的类型,

open class Currency {
    public var displayName:String?
    public var active:Bool?
    public var code:String?
    public var tradingPlatformID:String?
    public var ID:String?
}

现在,创建2个Currency类型的实例-一个用于购买,另一个用于出售,

var sellingCurrencyObj = Currency()
var buyingCurrencyObj = Currency()

接下来,在上述实例上使用swap(_:_:)操作

swap(&sellingCurrencyObj,&buyingCurrencyObj)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...