Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 快速将布尔转换为NSRange_Swift_Casting - Fatal编程技术网

Swift 快速将布尔转换为NSRange

Swift 快速将布尔转换为NSRange,swift,casting,Swift,Casting,当然,这不起作用,不会打印任何内容,Xcode会发出一条关于强制转换总是失败的警告: let bool = true if let range = bool as? NSRange { print(range) } 为什么这样做有效?我认为不应该: let bool: AnyObject = true if let range = bool as? NSRange { print(range) } 这将实际打印出0,0。。。如果它是假的,这可能有点道理,但它是真的,所以,

当然,这不起作用,不会打印任何内容,Xcode会发出一条关于强制转换总是失败的警告:

let bool = true  
if let range = bool as? NSRange {
  print(range)
}
为什么这样做有效?我认为不应该:

let bool: AnyObject = true    
if let range = bool as? NSRange {
  print(range)
}
这将实际打印出0,0。。。如果它是假的,这可能有点道理,但它是真的,所以,是的。。。对我来说没有意义


Swift 1.2或2.0中的行为相同。但这让我有点怀疑斯威夫特的类型系统。

这与其说是斯威夫特类型系统的错误,不如说是Objective-C互操作性的副作用

让bool:AnyObject=true实际上就是让bool=NSNumberbool:true。这不再是一个快速布尔,而是一个Obj-C基金会NSO对象。

那么,让range=bool作为?NSRange尝试将您的值转换为NSRange。NSNumber是NSValue的一个子类,因此与

let range = NSNumber(bool: true).rangeValue
返回{0,0}。这就是NSValue的工作原理。以下是从料斗中进行的一些拆卸:


从Swift团队的角度来看,如果他们在进行转换之前更仔细地检查类型,这可能是可以解决的。你应该考虑。

这完全有意义,尽管它也打破了我对AS的假设。运算符,即它只检查特定类型,仅此而已。我没有意识到它也会强迫价值观。但就我所知,这只发生在任何对象上。。。我不确定我是否应该在这个问题上提出错误。似乎这是预期的行为。有没有办法确定原始值类型?在转换为NSNumber时,类型信息似乎丢失了。可能需要发布另一个关于这个的问题…你可以使用objCType来获得一些想法,但这并不完美,因为NSNumber并不总是存储确切的类型。你还可以考虑吗?NSNumber在没有强制的情况下执行类检查。但我建议不要将NSRange与nsnumber混用。你真的需要在这里使用AnyObject吗?这可能看起来很混乱,但我想说,让bool:AnyObject=true从一开始就没有什么意义,除非你真的想处理NSArray/NSDictionary。我提供的代码是我在生产中没有使用的任意示例。生产代码是一个转换层,用于转换应用于后端数据库的NSPredicate中使用的项。我检查需要转换为db安全类型的特定类型。在本例中,NSRange存储为字符串,因此我检查该类型。传入Bool并将其转换为字符串时发生崩溃,因为它被强制转换为NSRange。很容易修复,但是是的,不能离开任何物体。。。