在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
。正如我上面提到的,我的应用程序中有类似的代码行。我想知道是否有办法解决这个问题。也许使用某种扩展?
答案 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
我希望它有所帮助。