繁体   English   中英

如何在swift3中从Any获取字符串

[英]How can I get String from Any in swift3

如我从fetchData获得一个dic

(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.

警告:

考试


编辑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)"

试试这个:

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

更新:

如果调用代码使用Any?调用上述函数Any? 参数显式转换为Any (Swift 3编译器允许的一种奇怪的情况),然后它将认为参数的最终类型是非可选的可选值,即Any类型,其中Any表示的类型是Any? 或者,换句话说,该值将被视为Optional<Any>.some(value:Any?)

在这种情况下, if let我们解开“某些”情况,则会在函数实现中返回一个可选值。 这意味着最终的字符串描述将包含“ Optional”名称。

由于Swift 3编译器会在AnyAny?之间愉快地转换这一事实,存在种种奇怪之处Any? 并将类型为Any的值视为类型为Any的值Any? 反之亦然,要检测Any真的包含“ Any?”实际上非常复杂。 是否可以,并相应地进行包装。

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

尽管这似乎是您要找的东西,但我认为解决程序员无论如何都不应该做的事情是很麻烦的,即错误地传递了已知的Any? value可以是Any因为编译器对此有一个奇怪的异常,即使它实际上不是真的。

这是代码的“防开发人员”版本:

protocol OptionalType {
    var unsafelyUnwrapped: Any { get }
    var unsafelyFlattened: Any { get }
}

extension Optional: OptionalType {
    var unsafelyUnwrapped: Any { return self.unsafelyUnwrapped }
    var unsafelyFlattened: Any { return (self.unsafelyUnwrapped as? OptionalType)?.unsafelyFlattened ?? self.unsafelyUnwrapped }
}

func stringFromAny(_ value:Any?) -> String {
    switch value {
    case .some(let wrapped):
        if let notNil =  wrapped as? OptionalType, !(notNil.unsafelyFlattened is NSNull) {
            return String(describing: notNil.unsafelyFlattened)
        } else if !(wrapped is OptionalType) {
            return String(describing: wrapped)
        }
        return ""
    case .none :
        return ""
    }
}

使用! 如果该值是可选的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM