无法将NSNumber桥接到Float Swift 3.3

时间:2018-04-04 02:38:55

标签: json swift

在Xcode更新后,我遇到了一个奇怪的问题。在我的应用程序中,当我从API获得响应时,我手动解析它并将其映射到我的模型。在我的代码中有很多地方我将JSON值转换为Float,并使用如下所示的空合并:

randomVariable = jsonDict["jsonKey"] as? Float ?? 0

它过去工作正常,但在更新后,它总是默认为0.为了确定原因,我尝试强制将其转换为Float,如下所示

randomVariable = jsonDict["jsonKey"] as! Float

这导致以下错误

  

无法将NSNumber桥接到Float

经过进一步调查,我发现Xcode正在使用Swift 3.3(以前,它使用的是Swift 3.2)。我在StackOverflow上找到的解决方案围绕着将其转换为NSNumber而不是Float。正如我上面提到的,我的应用程序中有类似的代码行。我想知道是否有办法解决这个问题。也许使用某种扩展?

3 个答案:

答案 0 :(得分:10)

如您所见,您可能需要先将其强制转换为randomVariable = (jsonDict["jsonKey"] as? NSNumber)?.floatValue ?? 0

这样的事情:

jsonDict\[([^\]]*)\] as\? Float

也许正则表达式替换可以帮助您更新代码。

模式:(jsonDict[$1] as? NSNumber)?.floatValue

替换为:import sys x = [1, 4] y = [1, 5] def to_complex(hor, ver): list_of_points = list(zip(hor, ver)) list_of_points.sort(key=lambda el: (el[0], el[1])) complex_points = [complex(item[0], item[1]) for item in list_of_points] return complex_points # Brute force algorithm. def brute_force(points=to_complex(x, y)): n = len(points) if n < 2: return sys.maxsize else: min_distance = sys.maxsize for i in range(n): for j in range(i + 1, n): if abs(points[i] - points[j]) < min_distance: min_distance = abs(points[i] - points[j]) closest_pair = (points[i], points[j]) return min_distance, closest_pair print(brute_force())

答案 1 :(得分:4)

问题出在 32位架构中,并在swift 4.1中更新了 NSNumber 类。

例如,当我将数字 1.1 写入字典时,它将被存储为64位NSNumber,其中最准确的表示形式= 1.10000000000000008881784197001 ......

所以,当你读这个号码的时候!浮动它将失败,因为32位精度不足以获得这种最准确的表示。

32位中最准确的表示形式= 1.10000002384185791015625

64 bit presentation of float number

因此,您需要获得在NSNumber.floatValue()函数中实现的截断结果。

randomVariable = (jsonDict["jsonKey"] as! NSNumber).floatValue

答案 2 :(得分:0)

在我发现def server(): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) address = ('127.0.0.1', 5020) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(address) server.listen(1) conn, addr = server.accept() ... ... conn.sendall(response_ok(some_stuff)) ... conn.close() 之前,我曾经这样做过,手动解析数据。您可能需要检查其源代码,以了解它如何解析您的数据。

SwiftyJSON

既然我已经提到了// Sample: rate is a Float // Number if let number = dictionary[SerializationKeys.rate] as? NSNumber { print("IS A NUMBER") rate = number.floatValue } // String if let string = dictionary[SerializationKeys.rate] as? String { print("IS A STRING") let decimalNumber = NSDecimalNumber(string: string) rate = decimalNumber.floatValue } ,我想建议它避免这样的头痛。把json的解析留给那个人。 https://github.com/SwiftyJSON/SwiftyJSON

我希望它有所帮助。