【问题标题】:guard let number as NSString and NSNumber保护让数字作为 NSString 和 NSNumber
【发布时间】:2021-09-08 12:55:28
【问题描述】:

我从不同来源获取数据,变量可以是数字或数字字符串。如何确保“(number as?NSString)”或“(number as?NSNumber)”总是成功?类似于 Java optInt 的东西,即使数字是字符串也永远不会失败。请参见下面的示例:

func testNumber()
    {
        var number = 123
        guard let a = (number as? NSNumber)?.intValue else { print("1");return; }
    }

func testNumberString()
{
    var number = "123"
    guard let a = (number as? NSNumber)?.intValue else { print("2");return; } // this failed.
}
func testNumberToString()
{
        var number = 123
        guard let a = (number as? NSString)?.intValue else { print("2");return; } // this sometimes failed too depend on datasource.
}
    

【问题讨论】:

  • 所以无论输入是字符串还是整数,你都想要 number/ Int 结尾吗?
  • 你的意思是你的输入是数字或字符串,但你想要整数作为返回?如果是,那么您可以使用泛型。
  • @RajaKishan 我希望根据不同的情况选择最终结果为 NSString 或 NSNumber,没有错误。

标签: swift nsstring nsnumber


【解决方案1】:

正如我从您的问题中了解到的那样,无论输入类型是字符串还是整数,您都需要一个整数值。

您可以使用ExpressibleByStringLiteral 实现此目的。

这里是演示

extension Int: ExpressibleByStringLiteral {
    public typealias StringLiteralType = String
    
    public init(stringLiteral value: StringLiteralType) {
        self = Int(value) ?? 0
    }
}

这个 Int 扩展允许你接受字符串值作为 Int 并返回 int 值。如果它没有转换它会默认给你0

例子

func testInt() {
    let numberOne: Int = "5656"
    let numberTwo: Int = 1234
    print(numberOne)
    print(numberTwo)
}

或者另一种方法是创建自己的ExpressibleByStringLiteral,它可以帮助您根据需要提供默认值。

struct StringInt: ExpressibleByStringLiteral {
    var value: Int?
    init(stringLiteral value: String) {
        self.value = Int("\(value)")
    }
    
    func wrapped(with defaultValue: Int) -> Int {
        return self.value ?? defaultValue
    }
}

例子

func testInt() {
    var numberThree: StringInt = "5656"
    print(numberThree.value as Any) // with nil or optional value
    
    numberThree = "asf"
    print(numberThree.wrapped(with: 15)) // with default value
    
    /**
     Output
     Optional(5656)
     15
     */
}

【讨论】:

  • 从字符串创建字符串的字符串插值是多余的。
  • @vadian 我不明白你的意思。你能补充更多信息吗?
  • 只需删除 init 方法中的 ”\()” 即可从字符串创建 Int。 value 已经是一个字符串。
  • 对不起,我是如何使用警卫的(如示例中提供的)?因为这个数字可能为零或根本不存在。
  • 这里不需要看守。您将始终从 string 或 int 获得 int 值。如果失败,它将为您提供与 Java optInt 相同的默认值,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多