[英]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.