有没有办法在Swift中使用反向范围?
例如:
for i in 5...1 {
// do something
}
Run Code Online (Sandbox Code Playgroud)
是一个无限循环.
我知道我可以使用1..5,计算j = 6 - i和使用j我的索引.我只是想知道是否有更清晰的东西?
我的应用程序使用了一个在二进制文件中编码的有点复杂的不可变数据结构.我需要在字节级别访问它,避免任何复制.通常,我会使用C或C++指针算法和类型转换来访问和解释原始字节值.我想对Swift做同样的事情.
我发现以下工作:
class RawData {
var data: NSData!
init(rawData: NSData) {
data = rawData
}
func read<T>(byteLocation: Int) -> T {
let bytes = data.subdataWithRange(NSMakeRange(byteLocation, sizeof(T))).bytes
return UnsafePointer<T>(bytes).memory
}
func example_ReadAnIntAtByteLocation5() -> Int {
return read(5) as Int
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不确定它的效率如何.每次调用它时都要做data.subdataWithRange并NSMakeRange分配对象,或者它们只是处理指针的语法糖?
在Swift中有更好的方法吗?
编辑:
我创建了一个小的Objective-C类,它只封装了一个函数,用于将指针偏移给定的字节数:
@implementation RawDataOffsetPointer
inline void* offsetPointer(void* ptr, int bytes){
return (char*)ptr + bytes;
}
@end
Run Code Online (Sandbox Code Playgroud)
如果我在桥接头中包含此类,那么我可以将我的read方法更改为
func read<T>(byteLocation: Int) -> T {
let ptr = offsetPointer(data.bytes, CInt(byteLocation))
return UnsafePointer<T>(ptr).memory
}
Run Code Online (Sandbox Code Playgroud)
它不会从我的缓冲区复制数据,也不会分配其他对象. …
我正在尝试学习Shapeless(使用版本2.10.2).我创建了一个非常简单的可扩展记录:
val rec1 = ("foo" ->> 42) :: HNil
根据REPL,这有类型
shapeless.::[Int with shapeless.record.KeyTag[String("foo"),Int],shapeless.HNil]
我试图定义一个简单的函数:
def fun(x: ::[Int with KeyTag[String("foo"), Int], HNil]) = x("foo")
Run Code Online (Sandbox Code Playgroud)
但它甚至没有编译.我不能在类型声明中使用String("foo"),并得到错误.
我有两个问题:
编辑
我发现:
val rec1 = ("foo" ->> 42) :: HNil
val rec2 = ("foo" ->> 43) :: HNil
var x = rec1
x = rec2
Run Code Online (Sandbox Code Playgroud)
效果很好.我得出结论rec1,rec2和x属于同一类型.我只是不知道如何在代码中表达该类型!
我正在使用一个mutable Buffer,需要找出它有多少元素.
两者size和length方法都是定义的,继承自不同的特征.
是否有任何实际的性能差异,或者它们是否可以被视为完全同义词?
我是iOS开发的新手,我正在尝试同时学习故事板,Swift和iOS 8的新功能.
我创建了一个非常简单的故事板,使用Popover演示文件segue来显示另一个视图.在模拟器上,如果我为iPad运行它,它按预期工作.但是,如果我为iPhone而不是弹出窗口运行它,它会在原始视图的顶部显示全屏视图.这可以; 但是,没有办法解雇它并回到原来的屏幕.
我观看了WWDC 2014视频"228 A Look inside presentation controllers",如果他们完全使用代码构建用户界面,他们可以显示一个关闭按钮.
我还看过"411界面构建器中的新功能"会话,他们说这可以在Interface Builder中完成,但他们没有显示它,承诺在实验室中展示如何做,如果有人感兴趣的话.不幸的是,我没有参加WWDC 2014,或者认识任何人.我的Google搜索也没有返回任何有用的内容.
我有一个大型数组,我想通过将它的片段交给几个异步任务来处理.作为概念证明,我编写了以下代码:
class TestParallelArrayProcessing {
let array: [Int]
var summary: [Int]
init() {
array = Array<Int>(count: 500000, repeatedValue: 0)
for i in 0 ..< 500000 {
array[i] = Int(arc4random_uniform(10))
}
summary = Array<Int>(count: 10, repeatedValue: 0)
}
func calcSummary() {
let group = dispatch_group_create()
let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)
for i in 0 ..< 10 {
dispatch_group_async(group, queue, {
let base = i * 50000
for x in base ..< base + 50000 {
self.summary[i] += self.array[x]
}
})
}
dispatch_group_notify(group, …Run Code Online (Sandbox Code Playgroud) 在我的Scala程序中,我收到了一些JSON.
其中一个字段是可选的布尔值.如果字段丢失,或者其值为false,我想返回None.如果它的值是真的,我想回来Some(true).
这相当于转换Some(false)成None,我定义了以下功能:
def boolmap(ob: Option[Boolean]) = if(ob == Some(false)) None else ob
它有效,但它似乎不是非常惯用.有什么更优雅的吗?
我正在使用Akka 2.1.4.我需要我的一个演员向自己发送一条延迟的消息.
我试过,从演员的内部receive:
context.system.scheduler.scheduleOnce(1 second, self, msg)
但是,它不能编译,因为它找不到隐式的ExecutionContext.我在哪里可以得到它?
注意:我知道实际发件人不是我的演员,但这没关系,因为我不需要知道发件人是谁.
说我有类似的东西
let a = <some-complicated-expression>
在Xcode中有什么方法可以检查编译器推断出哪种类型a?
编辑:\
例如,在Eclipse Scala IDE中,通过将鼠标悬停在变量名称上,编辑器将显示推断类型