在Swift中将Optional <Any>强制转换为NSString

时间:2019-10-10 12:52:13

标签: swift signalr

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

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

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

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

print(type(of: data));将类型显示为可选<任何> And this is a frame of data received in debug mode

我正在尝试将其转换为字符串以对其进行解析,希望有人可以给我一个有关如何投射/解包的指针?我以为传入的数据是NSDictionary,但无论如何我似乎都无法解包。

1 个答案:

答案 0 :(得分:2)

在某种程度上,Objective-C中的id类型现在映射到Swift中的Any类型,它描述了任何类型的值,无论是类,枚举,结构还是任何其他值雨燕类型。在这里,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?确保您的对象符合特定的数据类型,否则它将返回nil。因此写data as? [String: Any]就是检查数据是否是String键和Any值的字典,我们使用Any,因为它可以是Array,{{1 }},String或我们目前不确定的任何其他数据类型。