[英]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.