我正在尝试在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) 我有一个扩展 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)
合适的解决方案是什么?
我们有一个简单的类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,错误仍然存在.另一个奇怪的行为,在我们的一个开发者机器上,相同的代码编译得很好.
经过一些研究,我们不知道发生了什么,以及如何解决或解决这个问题.
我正在尝试在 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) 我对 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给超级构造函数
协议类型“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) 编译时我在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) 假设我在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还提供了两个标识运算符(
===和!==),用于测试两个对象引用是否都引用同一个对象实例.有关更多信息,请参阅类和结构.
为什么当我们需要使用带有 flutter_bloc 的 Equatable 类时?,还有我们需要的道具呢?这是在颤振中以块模式创建状态的示例代码,请我需要详细的答案。先感谢您
abstract class LoginStates extends Equatable{}
class LoginInitialState extends LoginStates{
@override
List<Object> get props => [];
}
Run Code Online (Sandbox Code Playgroud) 我在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属性本身生成散列值.任何帮助深表感谢.