[英]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
可能是Int
, String
, ""
, 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编译器会在Any
和Any?
之间愉快地转换这一事实,存在种种奇怪之处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.