![](/img/trans.png)
[英]Swift: Converting NSNumber into NSString (NSNumber is not a subtype of NSString)
[英]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.