- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 Swift 泛型输入了两个版本的离散卷积算法。整数版本有效。但是浮点版本有乘法的问题:
import Foundation
import Swift
func linconv<T: IntegerType>(signal_A signal_A: [T], signal_B: [T]) -> [T]? {
// guard
guard signal_A.isEmpty == false && signal_B.isEmpty == false else {
return nil
}
// reverse at least one of the arrays
//let signal_A_reversed = Array(signal_A.reverse())
// size of new array
let N = signal_A.count + signal_B.count - 1
// new array for result
var resultSignal = [T](count: N, repeatedValue: 0)
for n in 0..<N {
for j in 0...n {
if j < signal_B.count && (n - j) < signal_A.count {
resultSignal[n] += signal_B[j] * signal_A[n - j]
}
}
}
return resultSignal
}
func linconv<T: FloatingPointType>(signal_A signal_A: [T], signal_B: [T]) -> [T]? {
// guard
guard signal_A.isEmpty == false && signal_B.isEmpty == false else {
return nil
}
// reverse at least one of the arrays
//let signal_A_reversed = Array(signal_A.reverse())
// size of new array
let N = signal_A.count + signal_B.count - 1
// new array for result
var resultSignal = [T](count: N, repeatedValue: T(0))
for n in 0..<N {
for j in 0...n {
if j < signal_B.count && (n - j) < signal_A.count {
resultSignal[n] += signal_B[j] * signal_A[n - j] // compiler says error here!
}
}
}
return resultSignal
}
最佳答案
FloatingPointType
Double
确实采用了协议(protocol)和 Float
类型,但相反,由于某种原因,该协议(protocol)不包括运算符方法的蓝图,例如(在您的情况下)*
二元运算符或 +=
赋值运算符。请注意,仅仅因为某些已知类型采用协议(protocol),该协议(protocol)本身不一定包含我们对采用它的那些类型所期望的所有蓝图的重要性。IntegerType
另一方面,协议(protocol)确实包括操作符方法的蓝图。
因此,您的通用 T
符合协议(protocol) FloatingPointType
不一定(在 swift 眼中)可乘等,因为该协议(protocol)不包含此类操作的蓝图。如果我们看 standard library reference for FloatingPointType ,我们看到它似乎只有 Double
才采用, Float
(和 CGFloat
)。我们知道所有这三种类型都可以很好地使用我们的常规运算符,所以嘿,为什么我们不能在符合 FloatingPointType
的泛型上使用这些运算符? ?再次,符合协议(protocol)的类型集合实际上无法洞察该协议(protocol)包含哪些蓝图 .
作为一个例子,看下面的协议(protocol),一些基本类型的扩展以符合它
protocol ReallyLotsOfAdditionalStuff {}
extension Int : ReallyLotsOfAdditionalStuff {}
extension Double : ReallyLotsOfAdditionalStuff {}
Int
和
Double
采用它。相反,如果我们不小心,我们可以期望泛型符合协议(protocol)
ReallyLotsOfAdditionalStuff
至少可以说,可添加(除了许多额外的东西),但自然地,情况并非如此。
T
的附加类型约束。在您的
FloatingPointType
功能。
protocol MyNecessaryFloatingPointTypeOperations {
func *(lhs: Self, rhs: Self) -> Self
func += (inout lhs: Self, rhs: Self)
// ... other necessary floating point operator blueprints ...
}
extension Float: MyNecessaryFloatingPointTypeOperations {}
extension Double: MyNecessaryFloatingPointTypeOperations {}
// Example: only type constraint to FloatingPointType
func errorFloatingPointType<T: FloatingPointType> (a: T, b: T) -> T {
return a * b // Error: binary operator '*' cannot be applied to two 'T' operands
}
// Example: additional type constraint to your custom protocol
func noErrorFloatingPointType<T: protocol<FloatingPointType, MyNecessaryFloatingPointTypeOperations>> (a: T, b: T) -> T {
return a * b // ok!
}
FloatingPointType
,添加您的自定义协议(protocol)作为
T
的附加类型约束在函数头中:
func linconv<T: protocol<FloatingPointType, MyNecessaryFloatingPointTypeOperations>>(signal_A: [T], signal_B: [T]) -> [T]? {
// ...
}
FloatingPointType
并在您的“子协议(protocol)”中添加所需的任何其他方法,例如:
protocol ImprovedFloatingPointType : FloatingPointType {
func *(lhs: Self, rhs: Self) -> Self
func += (inout lhs: Self, rhs: Self)
// ... other necessary integer and floating point blueprints
}
extension Float: ImprovedFloatingPointType {}
extension Double: ImprovedFloatingPointType {}
func linconv<T: ImprovedFloatingPointType>(signal_A: [T], signal_B: [T]) -> [T]? {
// ...
}
FloatingPointType
吗?首先是协议(protocol)(甚至作为我们自定义协议(protocol)的父协议(protocol))?如果我们只想制作一个泛型来处理两个 swift 浮点类型
Double
和
Float
,那么我们不妨只应用协议(protocol)
MyNecessaryFloatingPointTypeOperations
作为我们泛型的类型约束:
func myFloatingPointGenericFunction<T: MyNecessaryFloatingPointTypeOperations> (a: T, b: T) -> T {
// ...
return a * b
}
FloatingPointType
单个蓝图的协议(protocol):确定我们可以初始化的通用函数
T
使用整数初始化器的实例,即
init(_ value: Int)
.例如,在您的函数中:
// new array for result
var resultSignal = [T](count: N, repeatedValue: T(0)) // <--
FloatingPointType
协议(protocol),我们不妨将其作为蓝图添加到我们自己的协议(protocol)中,并将泛型类型约束移除到
FloatingPointType
完全。
protocol MyNecessaryFloatingPointTypeOperations {
func *(lhs: Self, rhs: Self) -> Self
func += (inout lhs: Self, rhs: Self)
init(_ value: Int)
// ... other necessary floating point blueprints
}
extension Float: MyNecessaryFloatingPointTypeOperations {}
extension Double: MyNecessaryFloatingPointTypeOperations {}
func myFloatingPointGenericFunction<T: MyNecessaryFloatingPointTypeOperations> (a: T, b: T) -> T {
// ...
var c = T(0) // OK
c += a * b // OK
return c
}
protocol MyCustomProtocol {
func *(lhs: Self, rhs: Self) -> Self
func += (inout lhs: Self, rhs: Self)
init(_ value: Int)
// ... other necessary integer and floating point blueprints
}
extension Int: MyCustomProtocol {}
extension Float: MyCustomProtocol {}
extension Double: MyCustomProtocol {}
func myIntAndFloatGenericFunction<T: MyCustomProtocol> (a: T, _ b: T) -> T {
// ...
var c = T(0) // OK
c += a * b // OK
return c
}
let aInt = 2
let bInt = 3
let aInt32: Int32 = 2
let bInt32: Int32 = 3
let aDouble = 2.5
let bDouble = 3.0
let cInt = myIntAndFloatGenericFunction(aInt, bInt) // 6
let cInt32 = myIntAndFloatGenericFunction(aInt32, bInt32) // error
let cDouble = myIntAndFloatGenericFunction(aDouble, bDouble) // 7.5
IntegerType
的好处。协议(protocol):它已经被许多整数类型采用,而对于我们的自定义协议(protocol),所有这些 int 类型(如果我们想在我们的泛型中使用它们)都需要显式扩展以采用我们的自定义协议(protocol)。
IntegerType
对于后者,大概是偏爱。
关于ios - Swift 泛型 : IntegerType Version Works But Not FloatingPointType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34458276/
我想避免创建 std::thread 的开销,因此我要实现一个线程池。我正在为一个设计决策而苦苦挣扎: 工作队列中的工作是否应该能够将工作添加到工作队列中?如果是,如何? 问题出现了,因为我想让我添加
color 属性正常工作,但其他两个属性(font-size 和 text-shadow)不起作用。当链接被访问时,它的字体大小应该减小到 20 px 并且应用 text-shadow 属性,但它没有
我已经安装并配置了 supervisor。 ps -ax 显示 10 个进程,例如:php/home/vagrant/Sites/mysite/artisan queue:work --tries=1
我对 php artisan queue::work 命令感到不安。 我的命令不起作用,但我的作业已插入作业表但从未执行。 我正在为队列使用 mongodb 驱动程序。 我做错了什么,请给我建议。 最
为什么我可以找到很多关于“工作窃取”的信息而没有关于“工作耸肩”作为动态负载平衡策略的信息? 通过“工作耸肩”,我的意思是将多余的工作从繁忙的处理器转移到负载较低的邻居上,而不是让空闲的处理器从忙碌的
首先,我正在为 MySQL 使用 DATE_ADD 函数。当试图在 php 中使用 $sqlA 时,由于某种原因它说语法错误(主要是 WHERE 之后的区域)。为什么? $sqlA = "SELECT
a:hover { color: #237ca8 !important; font-weight: bold; } a:active { color: #cccccc !imp
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this q
我试图让只能使用 Tab 键的用户可以访问我的网站。我遇到的问题是,当我尝试使用 tab 键选择 float 的 div 时,不会触发 :focus in css;我不知道为什么它没有被触发。鼠标悬停
我在尝试将 2 个 div 并排放置时遇到了问题。 display: inline 它会删除我的边框并且不会将两个 div 放在同一行上。 请指教: .gig { outline: 1px s
这是 fiddle :http://jsfiddle.net/j9Gmx/ 我怎样才能得到最小高度:100%;上类? 最佳答案 它正在 工作,但由于 div 的父级(正文)没有高度,100% 基本上是
我正在使用 Flutter WebRTC 来创建 P2P 视频通话。 我遇到了一个与网络相关的问题:我已经完成了应用程序,但它只适用于移动数据。 将网络更改为WiFi时,它不起作用并且连接状态挂起Ch
我是 JavaScript 和 jQuery 的初学者。我的 css 和 JavaScript 代码位于 html 文件外部。这个问题已经有了答案,我尝试了所有代码,但滚动不起作用。我不知道我错过了什
我正在使用 Sprin AMQP 的rabbittemplate 通过 RabbitMQ 发送和接收消息。我能够发送和接收消息,但是,我想优先处理消息。 例如,如果我推送 1000 条消息,假设奇数消
我已经在 WorkManager 中加入了一个PeriodicWork,并希望每次完成时都获取它的 Worker 的输出数据,但以下代码似乎不起作用,因为 Log 消息没有出现在 Logcat 中:
我有一个名为 areaOne 的 AngularJS 指令。当我使用 template 时,会显示模板,但当我在 area1.js 中使用 templateUrl 时,不会呈现模板 HTML。 我在这
“:after”选择器在应用于带有 FF 和 IE 的输入时不起作用 input:after { content: "title"; } 而它正在处理 p、a 等。 这是一个错
下面是适用于 oracle 但不适用于 PostgreSQL 的 Sql 查询。 select count(*) from users where id>1 order by username; 我知
position?:fixed 在 chrome 浏览器上不工作,但在 firefox 中工作正常。 我有一个侧边栏可以停止滚动并固定在顶部。它在 firefox 中运行完美,但在 chrome 中,
我有一段代码无法在 Firefox 中运行。当按钮悬停时,.icon 图像不会改变。它在 Chrome 中完美运行。 button.add-to-cart-button .button-left .i
我是一名优秀的程序员,十分优秀!