Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.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
Ios 怪异的Swift 4型系统_Ios_Json_Types_Swift4_Xcode9 - Fatal编程技术网

Ios 怪异的Swift 4型系统

Ios 怪异的Swift 4型系统,ios,json,types,swift4,xcode9,Ios,Json,Types,Swift4,Xcode9,有人能解释一下找出Int类型的最佳方法吗?因为swift4,我在JSON上遇到了很多麻烦 因为当我试图将同一个json对象映射到核心数据实体和PONSO时,这种情况非常常见 所以 因此,我无法同时满足这两个要求。无论如何,我能避免Swift 4中这种毫无意义的int情况吗?之所以令人困惑,是因为在Swift中,as?有两个完全正交的含义,具体取决于上下文。当纯粹处理Swift类型时,as?是一个动态强制转换,仅当类型是as?运算符右侧的类型实例时,才会返回非nil: import Founda

有人能解释一下找出Int类型的最佳方法吗?因为swift4,我在JSON上遇到了很多麻烦

因为当我试图将同一个json对象映射到核心数据实体和PONSO时,这种情况非常常见

所以


因此,我无法同时满足这两个要求。无论如何,我能避免Swift 4中这种毫无意义的int情况吗?

之所以令人困惑,是因为在Swift中,
as?
有两个完全正交的含义,具体取决于上下文。当纯粹处理Swift类型时,
as?
是一个动态强制转换,仅当类型是
as?
运算符右侧的类型实例时,才会返回非
nil

import Foundation

let dict: [String : Any] = ["Foo" : 3 as Int]

print(dict["Foo"] as? Int)
print(dict["Foo"] as? Int32)
print(dict["Foo"] as? Int64)
这将为第一个日志返回
Optional(3)
,为另外两个日志返回
nil
,因为类型是
Int
,而不是
Int32
Int64

但是,当要转换的项目类型为Objective-C类型时,
as?
不再是严格的动态转换,而是导致桥接行为:

import Foundation

let dict: [String : Any] = ["Foo" : 3 as NSNumber]

print(dict["Foo"] as? Int)
print(dict["Foo"] as? Int32)
print(dict["Foo"] as? Int64)
这将为所有三个日志返回
Optional(3)
,因为这不再是动态强制转换。实际上,
NSNumber
实例不是我们尝试强制转换到的三种类型中的任何一种的成员。相反,
as?
使Swift将Objective-C类型,
NSNumber
连接到适当的Swift类型(如果可以的话)。由于Swift具有将NSNumber连接到
Int
Int32
Int64
(以及大量其他数字类型)的逻辑,因此我们为所有三个日志提供了
可选(3)
。但是,如果您尝试强制转换为类似于
Decimal
的对象,而该对象没有
NSNumber
桥接逻辑,则仍然会得到
nil

一个有趣的副作用是,
as?
不遵循传递属性:

let foo: Int = 3
print(foo as? NSNumber as? Int64) // Optional(3)
print(foo as? Int64)              // nil
无论如何,如果您首先将您的值转换为
NSNumber
,那么您应该能够从那里转换为Objective-C桥支持的任何数字类型,这可能就是您的旧Swift 3代码在后台发生的事情。或者,如果您确实知道该值应为的类型,则可以使用其他整数类型的初始值设定项之一:

let dict: [String : Any] = ["Foo" : 3 as Int]

let foo = (dict["Foo"] as? Int).map { Int32($0) }

之所以令人困惑,是因为在Swift中,
as?
有两个完全正交的含义,具体取决于上下文。当纯粹处理Swift类型时,
as?
是一个动态强制转换,仅当类型是
as?
运算符右侧的类型实例时,才会返回非
nil

import Foundation

let dict: [String : Any] = ["Foo" : 3 as Int]

print(dict["Foo"] as? Int)
print(dict["Foo"] as? Int32)
print(dict["Foo"] as? Int64)
这将为第一个日志返回
Optional(3)
,为另外两个日志返回
nil
,因为类型是
Int
,而不是
Int32
Int64

但是,当要转换的项目类型为Objective-C类型时,
as?
不再是严格的动态转换,而是导致桥接行为:

import Foundation

let dict: [String : Any] = ["Foo" : 3 as NSNumber]

print(dict["Foo"] as? Int)
print(dict["Foo"] as? Int32)
print(dict["Foo"] as? Int64)
这将为所有三个日志返回
Optional(3)
,因为这不再是动态强制转换。实际上,
NSNumber
实例不是我们尝试强制转换到的三种类型中的任何一种的成员。相反,
as?
使Swift将Objective-C类型,
NSNumber
连接到适当的Swift类型(如果可以的话)。由于Swift具有将NSNumber连接到
Int
Int32
Int64
(以及大量其他数字类型)的逻辑,因此我们为所有三个日志提供了
可选(3)
。但是,如果您尝试强制转换为类似于
Decimal
的对象,而该对象没有
NSNumber
桥接逻辑,则仍然会得到
nil

一个有趣的副作用是,
as?
不遵循传递属性:

let foo: Int = 3
print(foo as? NSNumber as? Int64) // Optional(3)
print(foo as? Int64)              // nil
无论如何,如果您首先将您的值转换为
NSNumber
,那么您应该能够从那里转换为Objective-C桥支持的任何数字类型,这可能就是您的旧Swift 3代码在后台发生的事情。或者,如果您确实知道该值应为的类型,则可以使用其他整数类型的初始值设定项之一:

let dict: [String : Any] = ["Foo" : 3 as Int]

let foo = (dict["Foo"] as? Int).map { Int32($0) }

如果您有任何特定的JSON问题,请显示JSON和您用来解析它的代码。上面的代码没有演示任何与JSON相关的内容
[String:Any]
是“一个字符串字典,绝对可以用Swift表示任何数据类型。”这通常用于JSON,但使用NSJSONSerialization解析JSON永远不会生成您在这里给出的字典。上面没有什么是“无意义的”,它看起来完全遵循规则,因此解释您试图解决的问题可能会有所帮助。JSON没有32位或64位整数类型。请注意,Swift的Int与ObjC的NSInteger匹配,并且(与ObjC一样)是Swift中几乎所有“类整数”类型的推荐类型。除非低级别交互或确保32位平台上的整数非常大,否则强烈建议不要使用特定的位宽度。它们的设计不是为了在Swift中通用;它们专为您需要非常精确的大小并希望在违反大小要求时收到警告而设计。如果您有任何特定的JSON问题,请显示JSON以及用于解析它的代码。上述代码没有演示任何与JSON相关的内容
[String:Any]
是“一个字符串字典,绝对可以用Swift表示任何数据类型。”这通常用于JSON,但使用NSJSONSerialization解析JSON永远不会生成您在这里给出的字典。上面没有什么是“无意义的”,它看起来完全遵循规则,因此解释您试图解决的问题可能会有所帮助。JSON没有32位或64位整数类型