ios – 如何在swift3中从Any获取String

ios – 如何在swift3中从Any获取String,第1张

概述比如我从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" - 比如我从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

在游乐场试过. :

import UIKitlet dict:[String:Any]  = ["aa": 123,"year":1994,"month":"12"]let string = String(describing:dict["year"]) ?? ""   // Try to turn result into a String,oprint(string)  // If I print(string!),and there will report error.

警告:

编辑2

我知道编辑-2可能会绘制百合,但如果使用下面的函数,当我将一个Opitional值传递给func时,返回String也将是Opitinal,如何避免?

以下是我在Playground中的测试,dic [“b”]为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的参数(Swift 3编译器允许的奇怪场景),然后它会将参数的最终类型视为非可选的可选项,即Any表示的Any值是Any?.或者,换句话说,该值将被视为可选< Any> .some(值:Any?).

在这种情况下,if to letwrap“some”case返回一个可选值作为函数实现中的结果.这意味着最终的字符串描述将包含“可选”标识.

由于Swift 3编译器很乐意在Any和Any之间进行转换,因此存在各种奇怪之处?并将Any类型的值视为Any类型的值?反之亦然,检测Any是否确实包含“Any”实际上非常复杂.或不,并相应地解开.

下面提供了该功能的一个版本以及一些必要的附加扩展.这个版本将以递归方式展平包含任意数量的嵌套Any的Any值?在insIDe里面检索最里面的非可选值.

虽然这是你似乎正在寻找的东西,但我认为解决程序员不应该做的事情是很麻烦的,即误传一个已知的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 ""    }}
总结

以上是内存溢出为你收集整理的ios – 如何在swift3中从Any获取String全部内容,希望文章能够帮你解决ios – 如何在swift3中从Any获取String所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1066622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存