例如我从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
可能是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)"
答案 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
类型的Any
值Any?
。或者,换句话说,该值将被视为Optional<Any>.some(value:Any?)
。
在这种情况下,解包“some”的if let
返回一个可选值作为函数实现的结果。这意味着最终的字符串描述将包含“可选”标识。
由于Swift 3编译器很乐意在Any
和Any?
之间进行投射,并认为类型Any
的值为Any?
的值,因此存在各种奇怪之处。 1}}反之亦然,检测Any
是否真的包含“任何?”实际上非常复杂。或不,并相应地解开。
下面提供了此功能的一个版本,以及一些必要的附加扩展。此版本将以递归方式展平包含任意数量嵌套Any
个案的Any?
值,以检索最内层的非可选值。
虽然这是你似乎正在寻找的东西,但我认为解决程序员不应该做的事情是很麻烦的,即将一个已知的Any?
误差为{ {1}}因为编译器有一个奇怪的例外,即使它实际上不是真的。
以下是代码的“开发人员验证”版本:
Any
答案 1 :(得分:1)
如果值是可选的,则使用!
String(describing: nonNil) // "Optional(12)"
String(describing: nonNil!) // "12"