swift 如何在一行中初始化多个某种类型的变量

ljo96ir5  于 2022-12-28  发布在  Swift
关注(0)|答案(5)|浏览(120)

我想达到这样的目标

var a, b, c: MyType = MyType()

但该行未编译,因为编译器将类型注解MyType视为仅用于变量c,因此ab缺少类型注解或用于类型推断的初始值。
以下两种情况都是法律的的:

// legal but verbose
var a = MyType()
var b = MyType()
var c = MyType()

// legal but verbose to initialize
var a, b, c: MyType
a = MyType()
b = MyType()
c = MyType()

我能想到的这两种风格都是法律的的,但不知何故有些冗长,特别是当有几十个相同类型的变量时。
有什么优雅的方法可以达到这个目的吗?

muk1a3rh

muk1a3rh1#

Swift中的两个选项:逗号或元组。
使用逗号分隔语句:

var a = MyType(), b = MyType(), c = MyType()

使用元组语句:

var (a, b, c) = (MyType(), MyType(), MyType())

此外,您可以使用分号在一行中创建多个语句,但不建议这样做:

var a = MyType(); var b = MyType(); var c = MyType()
cqoc49vn

cqoc49vn2#

您可以在一行中声明多个常量或多个变量,用逗号分隔:

var a = "", b = "", c = ""


如果代码中存储的值不会改变,那么总是用let关键字将其声明为常量,变量只用于存储需要能够改变的值。
文件HERE
在您的情况下:

var a = MyType(), b = MyType(), c = MyType()
mpbci0fu

mpbci0fu3#

我的类型=我的类型()变量我的类型:[任意] = [整数、“字符串”、“abc”、双精度型等]

svmlkihl

svmlkihl4#

斯威夫特5 +

一些可能的解决方案(如果你打算多次这样做的话,也许值得这么做)是写一个结构体来初始化你的值,并在该结构体上写一个方法(或计算属性)来返回解压缩的各个组件。你还可以添加一个类型别名来提高可读性:

typealias MyTypeTrio = (a: MyType, b: MyType, c: MyType)

struct MyTypesPack {
    var a, b, c: MyType

    init(a: MyType = .init(), b: MyType = .init(), c: MyType = .init()) {
        self.a = a
        self.b = b
        self.c = c
    }

    var components: MyTypeTrio { (a, b, c) }
}

用法:

...

let (a, b, c) = MyPackTrio().components

当然,如果不需要那么细的控制粒度,也可以在任何地方添加一个静态(或非静态)helper方法(但最好是在名称空间中,例如MyType的扩展中)。
你可以简单地写:

extension MyType {
    static let trio: MyTypeTrio = (a: MyType(), b: MyType(), c: MyType())
}

然后把它当作:

var (a, b, c) = MyType.trio

我最近遇到了一个类似的情况关于颜色成分。
我当时是这么做的:

typealias RGBA = (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)

struct RGBAColor {
    var red, green, blue, alpha: CGFloat

    init(red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0) {
        self.red = red
        self.green = green
        self.blue = blue
        self.alpha = alpha
    }

    var components: RGBA { (red, green, blue, alpha) }
}
erhoui1w

erhoui1w5#

更聪明的方法是

let type = (MyType(), MyType(), MyType())
var (a, b, c) = type

相关问题