簡體   English   中英

在Swift中有一個具有多種類型的變量

[英]Have a variable with multiple types in Swift

我想有一個變量,它可以有多種類型(只有我定義的那些),如:

var example: String, Int = 0
example = "hi"

此變量應該只能包含Int和String類型的值。

這可能嗎?

謝謝你的幫助 ;)

以下是如何實現它。 完全符合您的期望。

protocol StringOrInt { }

extension Int: StringOrInt { }
extension String: StringOrInt { }

var a: StringOrInt = "10"
a = 10 //> 10
a = "q" //> "q"
a = 0.8 //> Error

NB! 我不建議你在生產代碼中使用它。 這可能會讓你的隊友感到困惑。

UPD:正如@Martin R所提到的:請注意,這僅限於“按慣例”限制可能的類型。任何模塊(或源文件)都可以添加extension MyType: StringOrInt { }一致性。

您正在尋找“具有相關值的枚舉”:

enum StringOrInt {
    case string(String)
    case int(Int)
}

您可以指定字符串或整數:

var value: StringOrInt
value = .string("Hello")
// ...
value = .int(123)

使用switch語句檢索內容:

switch value {
case .string(let s): print("String:", s)
case .int(let n): print("Int:", n)
}

如果聲明符合Equatable協議,那么您還可以檢查值是否相等:

enum StringOrInt: Equatable {
    case string(String)
    case int(Int)
}

let v = StringOrInt.string("Hi")
let w = StringOrInt.int(0)
if v == w { ... }

不,這對於類,結構等是不可能的。

但是協議是可能的。

你可以這樣:

protocol Walker {
func go()
}
protocol Sleeper {
func sleep()
}

var ab = Walker & Sleeper

甚至

    struct Person {
    var name: String
    }


var ab = Person & Walker & Sleeper

但我不建議用這種方式。

更有用的是:

struct Person: Walker, Sleeper {
/// code
}
var ab = Person

你可以使用Tuple

例:

let example: (String, Int) = ("hi", 0)

並通過索引訪問每個數據:

let stringFromExampleTuple = example.0 // "hi"
let intFromtExampleTuple = example.1 // 0

暫無
暫無

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

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