簡體   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