使用Swift初始化int4;bug还是预期的行为?
游乐场守则:使用Swift初始化int4;bug还是预期的行为?,swift,simd,swift2,ios9,Swift,Simd,Swift2,Ios9,游乐场守则: import simd let test = int4(1,2,3,4) // this works let x = 1 let test2 = int4(x,2,3,4) // doesn't work (nor does let x: Int = 1) let y: Int32 = 1 let test3 = int4(y,2,3,4) // works 很明显,int4需要Int32值,但在第一种情况下,它似乎能够在不明确指定Int类型的情况下计算出来,但在第二种情况
import simd
let test = int4(1,2,3,4) // this works
let x = 1
let test2 = int4(x,2,3,4) // doesn't work (nor does let x: Int = 1)
let y: Int32 = 1
let test3 = int4(y,2,3,4) // works
很明显,int4
需要Int32
值,但在第一种情况下,它似乎能够在不明确指定Int类型的情况下计算出来,但在第二种情况下(当整数首次存储为单独的变量时),它不能
这是Swift中的预期行为吗?乍一看,这似乎是预期行为 当您指定
let test = int4(1,2,3,4)
那里的整数文本隐式初始化为Int32类型。当你只是做一个
let x = 1
默认情况下,x的类型为Int。作为安全措施,Swift不会对整数和浮点类型进行隐式类型转换。您需要显式地将其强制转换为Int32才能使其正常工作:
let test2 = int4(Int32(x),2,3,4)
这就是为什么你的第三个例子有效。与其依赖类型推断来设置
y
是什么,不如将其设置为Int32类型,然后将类型对齐。乍一看,这似乎是预期的行为
当您指定
let test = int4(1,2,3,4)
那里的整数文本隐式初始化为Int32类型。当你只是做一个
let x = 1
默认情况下,x的类型为Int。作为安全措施,Swift不会对整数和浮点类型进行隐式类型转换。您需要显式地将其强制转换为Int32才能使其正常工作:
let test2 = int4(Int32(x),2,3,4)
这就是为什么你的第三个例子有效。与其依赖类型推断来设置
y
是什么,不如将其设置为Int32类型,现在使类型对齐。感谢您的洞察力:)我认为,由于Swift能够进行类型推断(从第一个示例开始),我不确定这是否意味着它应该在第二种情况下进行。不管怎样,作为一种安全措施是有意义的。顺便说一句,让我感到困惑的是错误消息说在让test2=int4(x,2,3,4)
的情况下,int4不能用(Int,Int,Int,Int)初始化。如果错误信息是无法用(Int,Int32,Int32,Int32)
初始化它,那么就更容易找出哪里出了问题。看起来斯威夫特可能已经使用了x
类型来推断我提供的其他参数的类型?@Matthew-可能值得提交一个增强请求,并提供一个小测试用例。我知道他们一直在努力改进类型推断和它报告的错误。根据我的经验,Swift中的错误消息从令人困惑到具有积极误导性。我已经学会了将似乎没有意义的Swift错误消息视为“Duh,sumptin错了……derp?”我所相信的是,所讨论的行有问题,这取决于我来找出问题所在。感谢您的洞察力:)我认为,由于Swift能够进行类型推断(来自第一个示例),我不确定这是否意味着它应该在第二种情况下进行类型推断。不管怎样,作为一种安全措施是有意义的。顺便说一句,让我感到困惑的是错误消息说在让test2=int4(x,2,3,4)
的情况下,int4不能用(Int,Int,Int,Int)初始化。如果错误信息是无法用(Int,Int32,Int32,Int32)
初始化它,那么就更容易找出哪里出了问题。看起来斯威夫特可能已经使用了x
类型来推断我提供的其他参数的类型?@Matthew-可能值得提交一个增强请求,并提供一个小测试用例。我知道他们一直在努力改进类型推断和它报告的错误。根据我的经验,Swift中的错误消息从令人困惑到具有积极误导性。我已经学会了将似乎没有意义的Swift错误消息视为“Duh,sumptin错了……derp?”我所相信的是,有问题的线路出了问题,这取决于我来找出问题所在。