将 Optional<Any> 转换为 Swift 中的 NSString

Cast Optional<Any> to NSString in Swift

我正在开发一个小型 swift 应用程序来处理来自 signalR 服务器的一些数据。我正在使用 SignalR-ObjC 客户端接收数据,并且我有一个事件处理程序设置来接收数据。

hubConnection.received = { data in
   print(data!);
}

这是上面一行打印到控制台的内容:

{
   A = (2);
   H = SystemHub;
   M = ConnectedUserCount;
}

print(type(of: data)); 显示类型为 Optional< Any >。 And this is a frame of data received in debug mode

我正在尝试将其放入字符串中以对其进行解析,希望有人可以指导我如何 cast/unwrap 这个?我以为传入的数据是一个 NSDictionary,但我似乎无法解包。

在某种程度上,Objective-C 中的 id 类型现在映射到 Swift 中的 Any 类型,它描述了任何类型的值,无论是 class、枚举、结构或任何其他 Swift 类型。这里,Any 是当对象是异构时赋予集合的类型。

您可以清楚地看到您的数据是一个字典,您可以按照以下方式访问它:

    hubConnection.received = { data in
        if let dict = data as? [String: Any] { // again any as value can be array or string
            print(dict)
        }
    }

您也可以访问内部值对象。

        if let dict = data as? [String: Any], 
           let valueA = dict["A"] as? [Any], 
           let valueB = dict["B"] as? String, 
           let valueC = dict["C"] as? String {
            print(valueA)
            print(valueB)
            print(valueC)
        }

as? 确保您的对象符合特定数据类型,否则它将 return 为零。所以写 data as? [String: Any] 是检查数据是否是 String 键和 Any 值的字典,我们使用 Any 因为它可以是 ArrayStringNumber 或我们目前不确定的任何其他数据类型。