如何在swift3中从Any获取String

时间:2016-12-05 02:27:23

标签: ios swift swift3

例如我从dic获得fetchData

(lldb) po dic

▿ 3 elements
  ▿ 0 : 2 elements
    - .0 : "total"
    - .1 : 0.00
  ▿ 1 : 2 elements
    - .0 : "year"
    - .1 : 2016
  ▿ 2 : 2 elements
    - .0 : "month"
    - .1 : 12

(lldb) po dic["year"]
▿ Optional<Any>


(lldb) po dic["year"]!
2016

是否有一个函数可以String形成Any

该功能的用法如下:

let total = UtilSwift.getStrFromAny(dic["total"] as Any )

objective-c中,我写了一个方法:

+ (NSString*)getStringWithoutNull:(id)value
{
    NSString *strValue = @"";
   if(value != nil){
        strValue = [NSString stringWithFormat:@"%@", value];
    }

    if([strValue isEqualToString:@"null"])
    {
        return @"";
    }

    if ([strValue isEqual:[NSNull null]]) {

        return @"";
    }

    return strValue;
}

swift中是否可以编写这样的方法来String形成Any

Any可能是IntString""Double或其他类型。

编辑 - 1

Playground尝试之后。 :

import UIKit

let dict:[String:Any]  = ["aa": 123, "year":1994, "month":"12"]

let string = String(describing:dict["year"]) ?? ""   // Try to turn result into a String, o

print(string)  // If I print(string!), and there will report error.

警告:

the test

编辑2

我知道edit -2可能会描绘百合花,但如果使用下面的func,当我向Opitional传递func值时,返回字符串将会也是Opitinal,如何避免?

以下是我在Playground中的测试,dic["b"] as Any将参数转换为Opitional

   let dic:[String:Any] = [  // ["b": 12, "A": "A"]

    "A":"A",
    "b":12
]

func stringFromAny(_ value:Any?) -> String {

    if let nonNil = value, !(nonNil is NSNull) {

        return String(describing: nonNil) // "Optional(12)"
    }
    return ""
}

let str = stringFromAny(dic["b"] as Any)  // "Optional(12)"

2 个答案:

答案 0 :(得分:6)

试试这个:

func stringFromAny(_ value:Any?) -> String {
    if let nonNil = value, !(nonNil is NSNull) {
        return String(describing: nonNil)
    }
    return ""
}

更新

如果调用代码使用显式转换为Any?的{​​{1}}参数调用上述函数(Swift 3编译器允许的奇怪场景),那么它将考虑最终类型参数是非可选的可选项,即Any表示Any类型的AnyAny?。或者,换句话说,该值将被视为Optional<Any>.some(value:Any?)

在这种情况下,解包“some”的if let返回一个可选值作为函数实现的结果。这意味着最终的字符串描述将包含“可选”标识。

由于Swift 3编译器很乐意在AnyAny?之间进行投射,并认为类型Any的值为Any?的值,因此存在各种奇怪之处。 1}}反之亦然,检测Any是否真的包含“任何?”实际上非常复杂。或不,并相应地解开。

下面提供了此功能的一个版本,以及一些必要的附加扩展。此版本将以递归方式展平包含任意数量嵌套Any个案的Any?值,以检索最内层的非可选值。

虽然这是你似乎正在寻找的东西,但我认为解决程序员不应该做的事情是很麻烦的,即将一个已知的Any?误差为{ {1}}因为编译器有一个奇怪的例外,即使它实际上不是真的。

以下是代码的“开发人员验证”版本:

Any

答案 1 :(得分:1)

如果值是可选的,则使用!

String(describing: nonNil)  // "Optional(12)"
String(describing: nonNil!) // "12"