标签: equatable

如何在类层次结构中正确实现Equatable协议?

我正在尝试在Swift 3中的基类及其子类中实现==运算符(from Equatable).所有类都只在Swift中使用,因此我不想涉及NSObject或使用NSCopying协议.

我从一个基类和一个子类开始:

class Base {
    var x : Int
}

class Subclass : Base {
    var y : String
}
Run Code Online (Sandbox Code Playgroud)

现在我想添加Equatable==运营商Base.看起来很简单.==从文档中复制操作员签名:

class Base : Equatable {
    var x : Int

    static func == (lhs: Base, rhs: Base) -> Bool {
        return lhs.x == rhs.x
    }
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在为子类:

class Subclass : Base {
    static override func == (lhs: Base, rhs: Base) -> Bool { …
Run Code Online (Sandbox Code Playgroud)

subclass swift equatable swift3

13
推荐指数
3
解决办法
5006
查看次数

Flutter:带有可选参数的 Equatable props getter

我有一个扩展 Equatable 并包含可选参数的对象。如果我尝试将该参数添加到 props getter 中,则会收到错误The element type 'String?' can't be assigned to the list type 'Object'。但是,不添加它意味着该参数中具有不同值或没有值的对象内的相等性。

class Company extends Equatable {
  final String name;
  final String? logo;
....

@override
List<Object> get props {
  return [
    name,
    logo, //error here
....
Run Code Online (Sandbox Code Playgroud)

合适的解决方案是什么?

dart equatable flutter dart-null-safety

10
推荐指数
1
解决办法
4614
查看次数

RealmObject Equatable冗余消息

我们有一个简单的类Person,它来自领域Object.现在我们希望该子类符合Equatable协议.非常简单的代码看起来像这样.

class Person: Object, Equatable {

    dynamic var localID     = "0"
    dynamic var name:String?
}

func ==(lhs: Person, rhs: Person) -> Bool {

    return lhs.localID == rhs.localID
}
Run Code Online (Sandbox Code Playgroud)

我们从领域版本0.98.8开始,一切都按预期工作.当我们更新到版本0.102.0(以及其他版本之间)时,会出现编译器错误消息

Error: Redundant conformance of ‚Person‘ to protocol ‚Equatable‘
Run Code Online (Sandbox Code Playgroud)

不够奇怪,如果降级回版本0.98.8,错误仍然存​​在.另一个奇怪的行为,在我们的一个开发者机器上,相同的代码编译得很好.

经过一些研究,我们不知道发生了什么,以及如何解决或解决这个问题.

realm swift equatable

9
推荐指数
1
解决办法
1687
查看次数

Flutter bloc state 在更新 List/array 索引时不更新状态

我正在尝试在 bloc 类中实现复选框逻辑。为此,我List<bool> checked在块类中创建的代码如下。当CheckBoxClicked事件触发时,状态第一次更新,我可以看到该框已选中。

class CartProductsListBloc
    extends Bloc<CartProductsListEvent, CartProductsListState> {
  CartProductsListBloc() : super(InitialCartProductsListState());

  final ProductRepository productRepository = ProductRepository();
  List<bool> checked = List<bool>();
  var productsList;

  @override
  Stream<CartProductsListState> mapEventToState(
      CartProductsListEvent event) async* {
    if (event is FetchCartProductsList) {
      yield FetchingInProgress();
      try {
        productsList = await productRepository.loadListOfProductInUserCart();
        //initialize checked according to productsList
        for (int i = 0; i < productsList.length; i++) {
          checked.add(false);
        }
        yield FetchCartProductsListSuccess(
            productsList: productsList, checked: checked);
      } catch (error) {
        yield FetchCartProductsListFail(
            error: 'Fail to …
Run Code Online (Sandbox Code Playgroud)

equatable flutter-bloc

9
推荐指数
1
解决办法
1197
查看次数

将属性传递给 Equatable 的超级构造函数

我对 Flutter 和 Dart 还很陌生,并且在理解如何重写扩展 Equatable 更新版本的类时遇到了一些困难。

这适用于 Equatable 0.4.0:

abstract class Failure extends Equatable {
   Failure([List properties = const<dynamic>[]]) : super(properties);
}
Run Code Online (Sandbox Code Playgroud)

但是,更新到 Equatable 1.0.2 会引发错误super(properties)

位置参数太多:预期有 0​​ 个,但找到了 1 个。

尝试删除额外的参数。

我不明白如何使用 Equatable 1.0.2 传递properties给超级构造函数

super superclass dart equatable flutter

8
推荐指数
2
解决办法
2148
查看次数

协议类型“Any”的值不能符合“Equatable”;只有 struct/enum/class 类型可以符合协议

协议类型“Any”的值不能符合“Equatable”;只有 struct/enum/class 类型可以符合协议

值的类型为“ANY”,因为它可以是 Int 或 String。所以无法实现Equatable协议。

struct BusinessDetail:Equatable {
    static func == (lhs: BusinessDetail, rhs: BusinessDetail) -> Bool {
        lhs.cellType == rhs.cellType && lhs.value == rhs.value
    }
    
    let cellType: BusinessDetailCellType
    var value: Any?
}

enum BusinessDetailCellType:Int {
    case x
    case y

    var textValue:String {
        Switch self {
        case x:
            return "x"
        case y:
            return "y"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

enums struct ios swift equatable

8
推荐指数
2
解决办法
2万
查看次数

Swift 2.2中'Generic'与协议'Equatable'的冗余一致性

编译时我在Equatable中出错.我想在列表中添加find或contains方法来检查值. 我的代码如下

class Generic: NSObject, Equatable, NSCoding //Am Having an error -  Redundant conformance of 'Generic' to protocol 'Equatable'

{

  var genericCode: String?
  var genericName : String?
  var genericType : String?
  var genericImageUrl : String?
  var genericPhone: String?
  var orgName : String?

override init()
{

    self.genericCode = String("")
    self.genericName = String("")
    self.genericType = String("")
    self.genericImageUrl = String("")
    self.genericPhone = String("")
    self.orgName = String("")

}

//Parameterzed Constructor for the Generic
init(genericCode: String , genericName: String , genericPhone: String, genericType: String, genericImageUrl …
Run Code Online (Sandbox Code Playgroud)

protocols swift equatable

7
推荐指数
2
解决办法
5270
查看次数

使用ObjectIdentifier()和'==='运算符之间的区别

假设我在Swift中实现了一个根类,我声明它采用了Equatable协议(我希望能够判断我的类型的数组是否包含给定的实例).

有什么区别 - 在这种特定情况下 - 在实现协议所需的==运算符之间有什么区别:

public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {

    return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
}
Run Code Online (Sandbox Code Playgroud)

......而不是这样做:

public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {

    return (lhs === rhs)
}
Run Code Online (Sandbox Code Playgroud)

作为参考,这是文档所说的ObjectIdentifier():

类实例或元类型的唯一标识符.在Swift中,只有类实例和元类型具有唯一的标识.结构,枚举,函数或元组没有身份概念.

......这就是Swift编程语言(Swift 3)的"基本操作符"部分对===运算符的说法:

注意

Swift还提供了两个标识运算符(===!==),用于测试两个对象引用是否都引用同一个对象实例.有关更多信息,请参阅类和结构.

swift equatable

7
推荐指数
1
解决办法
2359
查看次数

使用带有 flutter_bloc 的 Equatable 类

为什么当我们需要使用带有 flutter_bloc 的 Equatable 类时?,还有我们需要的道具呢?这是在颤振中以块模式创建状态的示例代码,请我需要详细的答案。先感谢您

abstract class LoginStates extends Equatable{}

class LoginInitialState extends LoginStates{
  @override
  List<Object> get props => [];

}
Run Code Online (Sandbox Code Playgroud)

equatable flutter flutter-bloc

7
推荐指数
2
解决办法
2765
查看次数

Swift:具有字典属性的Hashable结构

我在Swift中有一个结构,如下所示:

internal struct MapKey {
    internal let id: String
    internal let values: [String:String]
}
extension MapKey: Equatable {}
func ==(lhs: MapKey, rhs: MapKey) -> Bool {
    return lhs.id == rhs.id && lhs.values == rhs.values
}
Run Code Online (Sandbox Code Playgroud)

我现在需要使用MapKey作为Swift字典中的键,这需要MapKey符合Hashable协议.

对于像这样的结构,Hashable的正确实现是什么?

extension MapKey: Hashable {
    var hashValue: Int {
        return ??? // values does not have a hash function/property.
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直在做一些研究,但未能确定散列字典的正确方法是什么,因为我需要能够为values属性本身生成散列值.任何帮助深表感谢.

hashable swift equatable

6
推荐指数
1
解决办法
2105
查看次数