簡體   English   中英

守衛讓數字作為 NSString 和 NSNumber

[英]guard let number as NSString and NSNumber

我從不同來源獲取數據,變量可以是數字或一串數字。 我如何確保“(編號為?NSString)”或“(編號為?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.
}
    

正如我從您的問題中了解到的,無論輸入類型是字符串還是整數,您都需要一個整數值。

您可以通過使用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
     */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM