如何在Swift中声明和使用位字段?
声明这样的枚举确实有效,但尝试将OR 2值一起编译失败:
enum MyEnum: Int
{
case One = 0x01
case Two = 0x02
case Four = 0x04
case Eight = 0x08
}
// This works as expected
let m1: MyEnum = .One
// Compiler error: "Could not find an overload for '|' that accepts the supplied arguments"
let combined: MyEnum = MyEnum.One | MyEnum.Four
Run Code Online (Sandbox Code Playgroud)
我查看了Swift如何导入Foundation枚举类型,它通过定义struct符合RawOptionSet协议的方式来实现:
struct NSCalendarUnit : RawOptionSet {
init(_ value: UInt)
var value: UInt
static var CalendarUnitEra: NSCalendarUnit { get }
static …Run Code Online (Sandbox Code Playgroud) 要在Objective-C中定义类别位掩码枚举,我曾经输入:
typedef NS_OPTIONS(NSUInteger, CollisionCategory)
{
CollisionCategoryPlayerSpaceship = 0,
CollisionCategoryEnemySpaceship = 1 << 0,
CollisionCategoryChickenSpaceship = 1 << 1,
};
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现相同的使用Swift?我尝试了枚举,但无法使其正常工作.这是我到目前为止所尝试的.

我有这个枚举:
enum GestureDirection:UInt {
case Up = 1 << 0
case Down = 1 << 1
case Left = 1 << 2
case Right = 1 << 3
}
Run Code Online (Sandbox Code Playgroud)
但在每种情况下我都会收到错误:
枚举案例的原始值必须是文字
我不懂.
Swift 1.2,Xcode 6.3.2
我浏览了raywenderlich.com上的Text Kit Tutorial和该行
edited(.EditedCharacters | .EditedAttributes, range: range, changeInLength: (str as NSString).length - range.length)
Run Code Online (Sandbox Code Playgroud)
产生以下错误:
No '|' candidates produce the expected contextual result type 'NSTextStorageEditActions'
Run Code Online (Sandbox Code Playgroud)
当我将第一个参数更改为时,错误消失了:
edited(.EditedCharacters, range: range, changeInLength: (str as NSString).length - range.length)
Run Code Online (Sandbox Code Playgroud)
我也试过用"OR"和"||" 没有任何成功.
Swift 2.2和iOS 9.2
嗨,我在swift 2.0中遇到此错误
无法使用类型'(NSCalendarUnit,fromDate:NSDate?,toDate:NSDate?,options:nil)的参数列表调用'components'
var hoy = dataFormatter.stringFromDate(NSDate())
var despues = dataFormatter.stringFromDate(fecha)
var calHoy = dataFormatter.dateFromString(hoy)
var calcDesp = dataFormatter.dateFromString(despues)
let cal = NSCalendar.currentCalendar()
let unit:NSCalendarUnit = .Day
let components = cal.components(unit, fromDate: calcDesp, toDate: calHoy, options: nil)
Run Code Online (Sandbox Code Playgroud) 在Objective-C我用过:
[@"abc def ghi abc def ghi" rangeOfString:@"c" options:NSBackwardsSearch];
Run Code Online (Sandbox Code Playgroud)
但现在NSBackWardsSearch似乎不存在.任何人都可以提供Swift的等效代码吗?
如果可能的话,我希望能够在整个字符串中找到字符编号.所以在上面的例子中它将返回3.
我的代码:
let calendar = NSCalendar.currentCalendar()
let dateComponents = calendar.components(NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit | NSCalendarUnit.DayCalendarUnit, fromDate: self)
Run Code Online (Sandbox Code Playgroud)
我的错误:
'YearCalendarUnit' was deprecated in OS X version 10.10: Use NSCalendarUnitYear instead
'MonthCalendarUnit' was deprecated in OS X version 10.10: Use NSCalendarUnitMonth instead
'DayCalendarUnit' was deprecated in OS X version 10.10: Use NSCalendarUnitDay instead
Run Code Online (Sandbox Code Playgroud)
但我不能键入NSCalendarUnitYear以及(NSCalendarUnitMonth/NSCalendarUnitDay)有什么问题?
我有一个正在构建的 SpriteKit 游戏,我正在从多维数组加载一个关卡。loadlevel 函数第一次工作。如果我做了它失败println的physicsBody上述physicsBody分配(在physicBody初始化后)。当我第二次删除所有瓷砖时removeChildrenInArray,我运行 load level 它会抛出一个错误fatal error: unexpectedly found nil while unwrapping an Optional,说它指向下面的正println下方的行。并且println表明它physicsBody是nil。在我看来,没有理由重新初始化PhysicsBody应该是nil。该println打印physicsBody nil。我不知道为什么physicsBody会是nil. 我只是想通过删除所有块节点并根据级别图在原始位置添加新节点来重置级别。
func loadLevel() {
var levels = Levels().data
var frameSize = view.frame.size
var thisLevel = levels[currentLevel]
println("running load level")
for (rowIndex,row) in enumerate(thisLevel) {
for (colIndex,col) in enumerate(row) {
if col == 4 { …Run Code Online (Sandbox Code Playgroud) 我正在创建一个自定义UI元素,并希望触发自定义UIControlEvent.我已经发现,有一个范围ApplicationReserved.
遗憾的是,这不起作用,因为它"不符合协议'RawRepresentable':
enum MyCustomEvents : UIControlEvents{
case Increase = 0x01000000
case Decrease = 0x02000000
}
Run Code Online (Sandbox Code Playgroud)
两个问题:
1)这是自定义事件的正确方法吗?
2)如何正确定义自定义事件?
谢谢!
我NS_OPTIONS在 Objective-C 中给出了一个定义:
typedef NS_OPTIONS(NSInteger, MyType) {
MyTypeOption1 = 1 << 0,
MyTypeOption2 = 1 << 1,
MyTypeOption3 = 1 << 2,
// etc
}
Run Code Online (Sandbox Code Playgroud)
我正在将此类型导入 Swift,但无法形成位字段。
let default : MyType = MyTypeOption1 | MyTypeOption2
Run Code Online (Sandbox Code Playgroud)
错误:
Protocol 'BinaryInteger' requires that 'MyType' conform to 'BinaryInteger'
Run Code Online (Sandbox Code Playgroud)
IDE 表明问题出在常设冒号按位或运算符。
改变NS_OPTIONS声明或用 Swift 声明新类型OptionSet不是……选项。我怎样才能让 Swift 打球?
swift ×10
ios ×7
bit-fields ×2
objective-c ×2
sprite-kit ×2
bit-masks ×1
enums ×1
macos ×1
nscalendar ×1
skspritenode ×1
string ×1
substring ×1