- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个包含 3 个字段的简单 Swift 类:
public class Cabbage: Comparable {
public let someString: String
public let someInt: Int
public let someDouble: Double
public init(_ someString: String, _ someInt: Int, _ someDouble: Double) {
self.someString = someString
self.someInt = someInt
self.someDouble = someDouble
}
public static func ==(lhs: Cabbage, rhs: Cabbage) -> Bool {
if lhs.someString == rhs.someString {
if lhs.someInt == rhs.someInt {
if lhs.someDouble == rhs.someDouble {
return true
}
}
}
return false
}
public static func <(lhs: Cabbage, rhs: Cabbage) -> Bool {
if lhs.someString < rhs.someString {
if lhs.someInt < rhs.someInt {
if lhs.someDouble < rhs.someDouble {
return true
}
}
}
return false
}
}
我认为我的第一个函数 func ==() 是正确的。当且仅当所有字段都相等时,我们才返回 true。
但我认为我的逻辑对于 func <() 是不正确的。
例如,如果 lhs.someString == rhs.someString,我是否应该比较 lhs.someInt 和 rhs.someInt?
如果这两者相等,我还应该比较 lhs.someDouble 和 rhs.someDouble 吗?
如有任何想法或建议,我们将不胜感激。
最佳答案
是的,仅仅检查 lhs.someString < rhs.someString
是不够的.您还需要确定是否 lhs.someString > rhs.someString
(或者如果 lhs.someString == rhs.someString
)。
正确书写的方法有很多种。这是一个:
public static func <(lhs: Cabbage, rhs: Cabbage) -> Bool {
if lhs.someString < rhs.someString { return true }
if rhs.someString < lhs.someString { return false }
if lhs.someInt < rhs.someInt { return true }
if rhs.someInt < lhs.someInt { return false }
return lhs.someDouble < rhs.someDouble
}
从 Swift 2.2 开始,标准库为最多六个元素的元组提供了比较运算符(如果所有元素都是 Comparable
)。
此外,感谢 SE-0283 , 所有 元组将很快(可能在 Swift 5.3 之后出现)符合 Comparable
(如果它们的元素都符合 Comparable
)。
下面是 SE-0283 定义元组比较的方式:
Comparing a tuple to a tuple works elementwise:
Look at the first element, if they are equal move to the second element. Repeat until we find elements that are not equal and compare them.
此定义也适用于 Swift 2.2 中添加的现有元组比较运算符。它也称为词典顺序。
所以我们可以使用元组比较来编写一个较短版本的<
对于 Cabbage
:
extension Cabbage: Comparable {
public static func <(lhs: Cabbage, rhs: Cabbage) -> Bool {
return (lhs.someString, lhs.someInt, lhs.someDouble)
< (rhs.someString, rhs.someInt, rhs.someDouble)
}
}
我们可以通过提取比较键的计算属性来减少代码重复。那么我们也可以用它来定义==
运算符(operator)。这就是我的意思:
extension Cabbage: Equatable, Comparable {
var comparisonKey: (String, Int, Double) {
return (someString, someInt, someDouble)
}
public static func ==(lhs: Cabbage, rhs: Cabbage) -> Bool {
return lhs.comparisonKey == rhs.comparisonKey
}
public static func <(lhs: Cabbage, rhs: Cabbage) -> Bool {
return lhs.comparisonKey < rhs.comparisonKey
}
}
关于swift - 在 Swift 4.2 中,如何编写 func<() 来比较类中的 3 个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53107198/
我在等待异步功能完成时苦苦挣扎。特别是,我发现这两种方法在测试继续之前等待异步函数完成,但不知道其中的区别(如果有区别的话):。我的目标是在实际测试开始之前等待bepreEach()块中的两个异步函数
我在等待异步功能完成时苦苦挣扎。特别是,我发现这两种方法在测试继续之前等待异步函数完成,但不知道其中的区别(如果有区别的话):。我的目标是在实际测试开始之前,在beforeEach()块中等待两个Ja
为什么是Func<>从 Expression> 创建通过 .Compile() 比仅使用 Func<> 慢得多直接声明? 我刚从使用 Func 更改为直接声明为从 Expression> 创建的一个在
我正在创建一个 Validator类(class)。我正在尝试实现 Linq SelectMany我的验证器的扩展方法能够使用 Linq 查询组合表达式并验证最终结果,即使基础值发生变化也是如此。 下
function sum(a) { let currentSum = a; function f(b) { currentSum += b; return f; }
我只知道i = i++;是未定义的行为,但是如果一个表达式中调用了两个或多个函数,并且所有功能是一样的。是未定义吗?例如: int func(int a) { std::cout << a <
我如何定义一个对象,以便作用于它的任何函数都作用于它的一个字段?这可能吗? class Mydata(object): def __init__(self, val): sel
这个问题一直很有趣,尽管它不一定很整洁。我有以下代码: import random def d(m): return random.randint(1, m) print(3*d(6)) 这将
能否请您解释一下使用 func.apply(null, arr) 的区别?和 func.apply(this, arr)在下面的代码示例中? var Foo = function() { fu
我想收集/运行任务,然后对它们执行 Task.WhenAll。 var tasks = new List(); foreach (var thing in things) { tasks.Add(
我有以下代码: static Func s_objToString = (x) => x.ToString(); static Func s_stringToString = s_objToStrin
相关主题: Create Expression> dynamically 我在互联网上搜索但所有样本都解释了 Expression来自 T ? 谢谢 编辑 1) T输入我的代码在运行时确定,例如我想用
我正在尝试使用 LinqKit 动态生成 linqtosql 查询.在将表达式发送到 LinqKit 之前,我想检查要为预测添加的字段。所以我想出了一些想法,比如 Expression> GetPr
我遇到了一些麻烦,我写了一个 Func,IDE 不喜欢我在 Func 体内调用 Func ,我不太明白为什么,因为如果我将这个确切的代码放在方法体中,并使用相同的返回类型和参数,那么它就可以工作。 代
我现在正在学习使用 Class 语法来创建 React 组件,请注意我现在必须声明这样的方法: class Foo extends React.Component { ... bar
下面两种说法有区别吗?他们都工作。 if ( ((Func)(()=>true))() ) { .... }; if ( new Func(()=>true)()) { .... }; 最佳答案 不,
这个问题在这里已经有了答案: Difference between func() and (*this).func() in C++ (4 个答案) 关闭 6 年前。 如果我有一个带有虚函数而没有自
主要问题是“是否可以将任何类型的 func 作为参数传递以及如何传递?”。我正在学习 Go 并且想像这样制作我自己的异步包装函数: func AsyncFunc(fn func(), args ...
有没有简单的转换方法 Expression> 到 Expression> T从哪里继承自TBase? 最佳答案 只要 T 派生自 TBase,您就可以使用原始表达式的主体和参数直接创建所需类型的表达式
我有以下方法,其中 T 在 Func 中使用: public void DoSomething(string someString, Func someMethod) { if(some
我是一名优秀的程序员,十分优秀!