Swift:检查数据类型是否可以转换为Double

时间:2016-02-01 22:53:27

标签: ios swift

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

从另一个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 -branch。但是,如果我测试这种情况,我最终会遇到运行时错误和以下两条消息:

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

&安培;

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

有谁知道我的错误?

更新

这就是我的数据 - 阵列的创建方式:
下载和分配数据我正在使用 Objectiv-C 在我的Data.h文件中,我创建了数据 -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 文件中调用此函数,在这里我可以强制类型将下载的“项目”称为“数据”(我自己创造的课程。)

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

2 个答案:

答案 0 :(得分:3)

首先,您可以定义以下协议。

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
    }
}

从[Any]到[Double]

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

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]

答案 1 :(得分:0)

您对doubleValue:Double?的实施假设自我是String

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

datas[i].puls是由Objective-C JSON Parser创建的,在NULL的情况下产生NSNull的实例,但您希望设置为nil。

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

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