如何定义具有多个特定自定义类型的变量? (在 Swift 中)

How to define a variable with multiple specific custom types ? (in Swift)

大家好,您有时可能知道,如果我们可以定义一个可以存储多种变量类型的变量,那将会非常方便和干净。这个操作 如果我们使用 "Any" 而不是我们的类型名称,这很容易实现。 例如:

var a : Any     // defines a variable with ability to store all types except a nil
var b : Any?    // defines a variable with ability to store all types including nil
var c : String  // a variable storing only and only a String value
var d : String? // a variable such as "c" , but also includes nil too

在前两个中我们可以存储所有{Int、String、Float 等}。同样在第三个和第四个中,我们可以存储 String 值,而不能存储其他值,例如 "Int" 或 "Float" 。 但是如果在某些情况下我们想要一个可以存储自定义类型的变量怎么办?例如,我想要一个可以存储 "Int" 值的变量,可以存储 "String" 值,但不能存储 "Float"s ?

var e : only(String and Int)
// some code like above, or even below :
var f : Any but not Float

有什么想法吗?请问有什么解决办法吗?

thanks dudes

目前没有办法实现这个功能。但是,更接近,在我看来,更好的方法是使用 Any 类型,然后在将值转换为所需类型时使用 guardif let 。下面是一个例子:

例子

let a: Any    //e.g. you only want to store Int and String in this variable
if let _ = a as? Int {
    //a is of type Int
} else if let _ = a as? String {
    //a is of type String
}

看来您需要使用 protocols

类似于:

protocol CustomType {
    // your definitions ...
}

extension String: CustomType {}
extension Int: CustomType {}

let customType1: CustomType = "string"
print(customType1)
let customType2: CustomType = 0
print(customType2)

// Error: Value of type 'Double' does not conform to specified type 'CustomType'
// let customType3: CustomType = 0.0

在这种情况下,CustomType 类型的值将只接受 StringInt 类型(因为协议一致性)。

在大多数情况下,当您想将多个类型存储在单个变量或集合中时,您会使用具有关联值的枚举:

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

var e: StringOrInt = .string("Hello World")
var f: StringOrInt = .int(42)
var g: [StringOrInt] = [e, f]