- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
Swift 的 OptionSetType
协议(protocol)的目的是什么,它与仅仅利用 Set
来获取那些 SetAlgebraType
方法有何不同?
最佳答案
我将从使用OptionSetType
时的实际角度来回答。对我来说,OptionSetType
的目的是移除 C/ObjC 中的所有位操作。
考虑一个例子,你有一个绘制矩形边框的函数。用户可以要求它在 0 到 4 个边框之间绘制。
这是 Swift 中的代码:
struct BorderType: OptionSetType {
let rawValue: Int
init (rawValue: Int) { self.rawValue = rawValue }
static let Top = BorderType(rawValue: 1 << 0)
static let Right = BorderType(rawValue: 1 << 1)
static let Bottom = BorderType(rawValue: 1 << 2)
static let Left = BorderType(rawValue: 1 << 3)
}
func drawBorder(border: BorderType) {
// Did the user ask for a Left border?
if border.contains(.Left) { ... }
// Did the user ask for both Top and Bottom borders?
if border.contains([.Top, .Bottom]) { ... }
// Add a Right border even if the user didn't ask for it
var border1 = border
border1.insert(.Right)
// Remove the Bottom border, always
var border2 = border
border2.remove(.Bottom)
}
drawBorder([.Top, .Bottom])
在 C 中:
typedef enum {
BorderTypeTop = 1 << 0,
BorderTypeRight = 1 << 1,
BorderTypeBottom = 1 << 2,
BorderTypeLeft = 1 << 3
} BorderType;
void drawBorder(BorderType border) {
// Did the user ask for a Left border?
if (border & BorderTypeLeft) { ... }
// Did the user ask for both Top and Bottom borders?
if ((border & BorderTypeTop) && (border & BorderTypeBottom)) { ... }
// Add a Right border even if the user didn't ask for it
border |= BorderTypeRight;
// Remove the Bottom border, always
border &= ~BorderTypeBottom;
}
int main (int argc, char const *argv[])
{
drawBorder(BorderTypeTop | BorderTypeBottom);
return 0;
}
C 比较短,但一眼就能看出这行是干什么的?
border &= ~BorderTypeBottom;
虽然这很有意义:
var border2 = border
border2.remove(.Bottom)
与 C 的斯巴达哲学相比,它符合 Swift 的目标,即成为一种富有表现力、易于学习的语言。
关于ios - OptionSetType 协议(protocol) Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38110941/
假设我有以下 OptionSetType struct Modifier : OptionSetType { typealias RawValue = Int var rawValue
我想创建一个带有自定义属性的 OptionSetType: struct Options: OptionSetType { let rawValue: Int init(rawValu
我有一个名为 ProgrammingLanguage 的枚举: enum ProgrammingLanguage { case Swift, Haskell, Scala } 现在我有一个名为 P
我试图弄清楚 OptionSetType 协议(protocol),但我有一些基本问题。 1)options是Array类型还是Set类型? 2) 我可以使用 for...in 循环或 for 循环访
我在自己的文件中定义了这个结构,想在其他地方和测试中使用它。 struct UserPermissions : OptionSetType { let rawValue: UInt s
鉴于以下情况: struct Weekdays: OptionSetType { let rawValue: Int init(rawValue: Int) { self.rawVal
我有一个 struct Person extends OptionSetType。在后面的代码中,如何使用 switch 语句来检查 Person 的实例是否有多个值? 谢谢 struct Perso
Swift 的 OptionSetType 协议(protocol)的目的是什么,它与仅仅利用 Set 来获取那些 SetAlgebraType 方法有何不同? 最佳答案 我将从使用OptionSet
在 Swift 1.2 之前,您可以在位掩码上执行 ~ (NOT): bitmask = ~otherBitmask 但是在 Swift 2.0 中,位掩码现在是 OptionSetType 并且您不
我在 Swift 中有一个自定义的 OptionSetType 结构。如何枚举实例的所有值? 这是我的 OptionSetType: struct WeekdaySet: OptionSetType
struct TimeMark: OptionSetType { private enum TimeMark : Int,CustomStringConvertible { case Head
在我的 Swift 类中,我为实现选项定义了一个 OptionSetType。 struct FulfillmentOption : OptionSetType { let rawValue:
我是一名优秀的程序员,十分优秀!