关于在Swift中解析基本算术表达式的提示

关于在Swift中解析基本算术表达式的提示,swift,Swift,考虑以下表达式: let N = 2048 var c = (0..<N).map{ f -> Float in sin( 2 * .pi * f / (N/2)) } 即使有上述情况,错误仍在继续 为什么swift在解析这些简单的算术表达式时如此薄弱?除了把它分解成碎片,我还能做什么 let c = a * b let f = c * d 这对于信号处理来说太过简单而不实用。我猜有一些技巧可以让编译器更智能一些:请分享。这看起来像java。那怎么办 let N =

考虑以下表达式:

 let N = 2048
 var c = (0..<N).map{ f ->  Float in sin( 2 * .pi * f / (N/2)) }
即使有上述情况,错误仍在继续

为什么
swift
在解析这些简单的算术表达式时如此薄弱?除了把它分解成碎片,我还能做什么

 let c = a * b
 let f = c * d

这对于信号处理来说太过简单而不实用。我猜有一些技巧可以让编译器更智能一些:请分享。

这看起来像java。那怎么办

 let N = 2048
 var c = (0..<N).map{ f in 
     sin( 2.0 * .pi * Float(f) / Float(N/2))
  }
设N=2048

VarC=(0..看起来像java,那么

 let N = 2048
 var c = (0..<N).map{ f in 
     sin( 2.0 * .pi * Float(f) / Float(N/2))
  }
设N=2048

var c=(0..问题是算术运算符(
+
-
*
/
)有很多重载。因此,当您编写包含大量这些运算符的表达式时,编译器无法及时解析它们

当您有类型错误时尤其如此。编译器试图找到正确的重载,但无法找到,因为您的类型不匹配,并且没有匹配的重载。但是,当编译器可以推断出这一点时,它已经超过解析表达式的超时时间,因此您得到的是该错误而不是实际的重载pe错误

只要通过将所有
Int
s强制转换为
Float
来解决类型错误,单行表达式就可以正常编译

let c = (0..<N).map{ f ->  Float in sin( 2 * .pi * Float(f) / Float(N/2)) }
设c=(0..sin中的Float(2*.pi*Float(f)/Float(N/2))}
一旦您这样做了,您甚至不再需要返回值的命名闭包参数和类型注释

let c = (0..<N).map{ sin(2 * .pi * Float($0) / Float(N/2)) }

让c=(0..问题是算术运算符(
+
-
*
/
)有很多重载。因此,当您编写包含大量这些运算符的表达式时,编译器无法及时解析它们

当您有类型错误时尤其如此。编译器试图找到正确的重载,但无法找到,因为您的类型不匹配,并且没有匹配的重载。但是,当编译器可以推断出这一点时,它已经超过解析表达式的超时时间,因此您得到的是该错误而不是实际的重载pe错误

只要通过将所有
Int
s强制转换为
Float
来解决类型错误,单行表达式就可以正常编译

let c = (0..<N).map{ f ->  Float in sin( 2 * .pi * Float(f) / Float(N/2)) }
设c=(0..sin中的Float(2*.pi*Float(f)/Float(N/2))}
一旦您这样做了,您甚至不再需要返回值的命名闭包参数和类型注释

let c = (0..<N).map{ sin(2 * .pi * Float($0) / Float(N/2)) }

let c=(0..我从零强制转换和类型提示开始,开始一次添加一个。我想我已经完全掌握了您在某个点上所展示的内容。我不太明白编译器到底是在什么问题上出错的;)啊,我现在明白了我错过了什么:特别是
Float(f)
Int
循环变量转换到
Float
。我在这里被反复停止或严重减慢。我使用的任何其他语言在解析基本算法方面都没有这么弱的能力。我从零转换和键入提示开始,开始一次添加一个。我认为我已经完全掌握了您在某个时候所展示的内容。我不太明白编译器到底是在什么问题上出错的;)啊,我现在明白我错过了什么:特别是
Float(f)
循环变量从
Int
转换到
Float
。我在这里被反复停止或严重减慢。我使用的任何其他语言在解析基本算法时都没有这么弱。哦,我明白了-我错过了循环变量
$0
。而其他一些类型的提示和转换是不必要的。因此我我对下一次如何处理这个问题感到更自在了。不幸的是,这真的很脆弱。我只是简单地更改了
sin(2.0
)(而不是
sin(2
),它给出了“无法在合理的时间内解析类型”@正如我所说的javadba,算术运算符有大量的重载,因此如果你弄乱了类型,那么编写复杂的算术表达式可能很容易失败。最好先将这些表达式拆分,以获得所有正确的类型,一旦完成,你就可以简化表达式。我只是有点困惑——还有哪种语言如此棘手写一个表达式。把一个表达式分解成微小的声音片段是不会发生的,因为它读起来很差。相反,我将这些“需求”编入目录.我做了一个
typealias Fl=Float
来帮助消除噪音。这不是一个一般的控诉:swift语言比我想到的其他两个更好。哦,我知道发生了什么-我错过了循环变量
$0
。而其他一些类型的提示和强制转换是不必要的。所以我觉得更舒服但下一次该怎么做呢。不幸的是,这真的很脆弱。我只是简单地更改了
sin(2.0
(而不是
sin(2
),它给出了“无法在合理的时间内解析类型”@正如我所说的javadba,算术运算符有大量的重载,因此如果你弄乱了类型,那么编写复杂的算术表达式可能很容易失败。最好先将这些表达式拆分,以获得所有正确的类型,一旦完成,你就可以简化表达式。我只是有点困惑——还有哪种语言如此棘手写一个表达式。把一个表达式分解成微小的声音片段是不会发生的,因为它读起来不好。相反,我将这些“要求”编入目录。我做了一个
typealias Fl=Float
,以帮助消除一点点噪音。这不是一个一般的控诉:swift语言比我想到的其他两种语言更好。