【问题标题】:Swift: Check if datatype can be converted to DoubleSwift:检查数据类型是否可以转换为 Double
【发布时间】:2016-02-03 03:34:30
【问题描述】:

我想检查从 MySQL-database 接收到的数据是否可以转换为 Double,如果可以,我想将其附加到数组中。 p>

从另一个question 我得到了以下代码:

extension String {
    struct NumberFormatter {
        static let instance = NSNumberFormatter()
    }
    var doubleValue:Double? {
        return NumberFormatter.instance.numberFromString(self)?.doubleValue
    }
    var integerValue:Int? {
        return NumberFormatter.instance.numberFromString(self)?.integerValue
    }
}

这是我关心的代码(在 for-loop 中):

if let value = datas[i].puls.doubleValue {
    pulsWerte.append(value)
    print(datas[i].puls)
}else {
    badIndex.append(i)
    continue
}

如果我的数据库条目是NULL,我的程序应该在else-分支中继续。但是,如果我测试这种情况,我最终会遇到运行时错误和以下两条消息:

-[NSNull length]: unrecognized selector sent to instance 0x1451238

&

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x1451238'

有人知道我的错误吗?

更新

这就是我的 datas-array 的创建方式:
我使用 Objectiv-C 下载和分配数据。
在我的 Data.h 文件中,我创建了我的 Data-class。

@interface Data : NSObject

@property (nonatomic, strong) NSString *sozialversicherungsnummer;
@property (nonatomic, strong) NSString *messzeitpunkt;
@property (nonatomic, strong) NSString *puls;
@property (nonatomic, strong) NSString *sauerstoffgehalt;

@end

在我的 HomeModel.m 中,我创建了一个名为“_data”的 NSMutableArray。下载完成后,这个数组填充如下:

for (int i = 0; i < jsonArray.count; i++)
{
    NSDictionary *jsonElement = jsonArray[i];

    // Create a new data object and set its props to JsonElement properties
    Data *newData = [[Data alloc] init];
    newData.sozialversicherungsnummer = jsonElement[@"Sozialversicherungsnummer"];
    newData.messzeitpunkt = jsonElement[@"Messzeitpunkt"];
    newData.puls = jsonElement[@"Puls"];
    newData.sauerstoffgehalt = jsonElement[@"Sauerstoffgehalt"];

    // Add this question to the locations array
    [_data addObject:newData];

}

当这一步完成后,我通过一个名为 "itemsDownloaded" 的函数在名为 "items" 的参数名称下获得了这个 "_data"-array 。
现在我在我的 Swift-文件中调用这个函数,在这里我可以将下载的 "items" 进行 typecast 为 "Data" (我自己创建的课程)。

func itemsDownloaded(items: [AnyObject]!) {
    let datas = items as! [Data]
.
.
.

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    首先你可以定义以下协议。

    DoubleConvertible

    protocol DoubleConvertible {
        func toDouble() -> Double?
    }
    

    使 String、Int 和 Double 符合 DoubleConvertible

    接下来,对于您希望转换为Double 的每种类型,您需要使该类型符合DoubleConvertible。

    让我们为String做吧

    extension String: DoubleConvertible {
        func toDouble() -> Double? {
            return Double(self)
        }
    }
    

    和Int

    extension Int: DoubleConvertible {
        func toDouble() -> Double? {
            return Double(self)
        }
    }
    

    还有...好吧Double

    extension Double: DoubleConvertible {
        func toDouble() -> Double? {
            return self
        }
    }
    

    从 [任何] 到 [双]

    现在给出几个不同类型的值列表

    let list: [Any?] = ["123", nil, "Hello", 456, true, 789.1]
    

    我们可以轻松地将其转换为Double 的列表。

    let listOfDouble = list
        .flatMap { $0 as? DoubleConvertible }
        .flatMap { $0.toDouble() }
    
    listOfDouble // [123.0, 456.0, 789.1]
    

    【讨论】:

    • 感谢您提出的解决方案!不幸的是,我不得不说这并不能解决我的问题。我仍然在该行中遇到相同的错误: .flatMap { $0 as?双转换}
    • 我的意思是我在问题中提到的输出中的两条消息:“-[NSNull length]: unrecognized selector...”
    • @S.Schweng:请在我的代码块之前使用这一行:print(list),让我知道日志中出现了什么。
    • 我用完全相同的 "list"-array 测试了您的代码,得到了预期的输出:“[123.0, 456.0, 789.1]”。但是当我像这样测试我的 datas 数组时: let listOfDouble = datas .flatMap{$0.puls as? DoubleConvertible} .flatMap{$0.toDouble()} print("listOfDouble: (listOfDouble)") 我再次遇到运行时错误...
    • 在我的日志中,这两条消息再次出现。
    【解决方案2】:

    doubleValue:Double? 的实现假定 self 是 String。

        var doubleValue:Double? {
            return NumberFormatter.instance.numberFromString(self)?.doubleValue
        }
    

    datas[i].puls 由 Objective-C JSON 解析器创建,在 NULL 的情况下生成 NSNull 的实例,但您希望设置为零。

    最简单的方法是检查jsonElement[@"Puls"] 中的NSNull,然后将newData.puls 设置为NULL:

    id puls = jsonElement[@"Puls"];
    if puls == [NSNull null] {
      newData.puls = null;
    } else {
      newData.puls = puls;
    }
    

    【讨论】:

    • 首先感谢您的支持!不幸的是,我不得不告诉你,你的建议并不能解决我的问题。看来我的代码仍在尝试达到长度方法......我得到了同样的错误......
    • 能否解释一下 datas[i].puls 结构是如何创建的?
    • 我扩展了我的建议解决方案。我忘了通过 is 运算符检查类型。请重试。
    • 好的,我会再试一次。我已经用你之前想要的信息扩展了我的问题。
    • 对不起,但它仍然不起作用......也许我得到的警告可以帮助你:-@ as?字符串-cast:来自“字符串!”的条件转换to 'String' 总是成功 - @ is String-cast: Conditional cast from 'String!' to 'String' 总是成功 & 'is' 测试总是 true - @ is NSNull-cast: Cast from 'String!'到不相关的类型“NSNull”总是失败
    猜你喜欢
    • 2013-05-29
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2013-07-14
    • 2012-08-16
    相关资源
    最近更新 更多