鉴于以下三个简单的功能:
func twice_Array_of_Int(a: [Int]) -> [Int] {
return a + a
}
func twice_Array_of_T<T>(a: [T]) -> [T] {
return a + a
}
func twice_Array_of_Any(a: [AnyObject]) -> [AnyObject] {
return a + a
}
Run Code Online (Sandbox Code Playgroud)
假设发布版本(-Os),你会如何期望他们的性能进行比较?
我的期望是,它[Int] -> [Int]会比[AnyObject] -> [AnyObject]...... 快得多......它的速度要快几个数量级.
但是,我也期望[T] -> [T]表现得比... 更好,[AnyObject] -> [AnyObject]并且差不多[Int] -> [Int]......对吧?
在这里,我证明是错的:即使[AnyObject] -> [AnyObject](甚至包括演员回来)也要[Int]快5倍[T] -> [T]!这是令人失望的,因为泛型是Swift最有前途的功能之一.
在其中一个WWDC视频中,Apple工程师提到他们正在本地实现泛型,即使用它们不会导致代码膨胀.这是否解释了表现不佳[T] -> [T]?如果他们只是在编译时消耗的通用功能,性能[T] -> [T] …
我想以AsyncSequence取决于序列是否可以抛出的方式进行扩展。既不AsyncSequence明确AsyncIteratorProtocol区分这些序列。然而,并发模块确实带有带有抛出和非抛出变体的具体序列。我看到的唯一一般区别next是非抛出序列的方法是重新抛出。这是一个例子:
extension AsyncMapSequence : AsyncSequence {
struct Iterator : AsyncIteratorProtocol {
mutating func next() async rethrows -> Transformed?
}
}
Run Code Online (Sandbox Code Playgroud)
而投掷变体是一个简单的throws:
extension AsyncThrowingMapSequence : AsyncSequence {
struct Iterator : AsyncIteratorProtocol {
mutating func next() async throws -> Transformed?
}
}
Run Code Online (Sandbox Code Playgroud)
(我什至不确定rethrows一个不带任何参数的方法如何可能。唯一想到的是这种方法的柯里化表达式可以对此有所启发...... )
因此,问题是如何表达以下内容:
extension AsyncSequence where AsyncIterator /* is not throwing */ {
}
Run Code Online (Sandbox Code Playgroud) 可以使用Objective-C++框架包装C++代码,以便在Swift代码中使用,包括Playground环境.我的一些框架包括OpenCV库,这在Swift正确包装时效果很好.不幸的是,由于以下错误,我无法在游乐场中使用这些:
Playground execution failed: error: Couldn't lookup symbols: _OBJC_CLASS_$_MyClass
Run Code Online (Sandbox Code Playgroud)
... 我的框架MyClass的子类在哪里NSObject.实际上,在链接到其中一个OpenCV库之后,没有框架符号可用于游乐场(例如,-lopencv_core在构建设置中添加到"其他链接器标志"之后),这些符号是否与OpenCV(或C++)有关.那件事).
我非常喜欢在导入框架的上下文中在游乐场中开发一些小功能,成功的解决方案最终将最终结束.同样,OpenCV对我来说是一个重要的图书馆,因此必须在游乐场玩它才能解放(更不用说有趣)了.
我还在使用Swift 1.2(OS 10.10.4),因为我即将向App Store提交更新,但如果Swift 2在这方面有任何改变,我会感兴趣.至于OpenCV,这是3.0.0版本,使用CMake和默认配置构建.
编辑:刚刚在Apple的论坛中发现了这个问题(比我更好,更普遍):https://forums.developer.apple.com/thread/6246