ios - 是否有可能创建对结构数组元素的引用?

标签 ios swift struct reference

给定一个带有structArray

    import Foundation
    
    struct Card {
        var flag: String = ""
    }
    
    var cards = Array<Card>()
    cards.append(Card())

下面的操作不会修改原数组元素

    // A copy is created.
    var cardCopy = cards[0]
    
    // Will NOT modify cards[0] 
    cardCopy.flag = "modify0"
    
    print(cards[0].flag)

下面的操作会修改原数组元素

    // We can modify cards[0] by
    cards[0].flag = "modify"

    print(cards[0].flag)

但是从某种意义上说效率不高,每次都需要进行索引访问。想象一下

    cards[0].flag0 = "modify"
    cards[0].flag1 = "modify"
    cards[0].flag2 = "modify"
    cards[0].flag3 = "modify"
    ...

有没有办法,我们可以创建对结构数组元素的引用?这样我们就可以写

// How to create a reference to cards[0]?
var cardReference = ...
    cardReference.flag0 = "modify"
    cardReference.flag1 = "modify"
    cardReference.flag2 = "modify"
    cardReference.flag3 = "modify"
    ...

其中一种可能性是将struct 替换为class。但是,在这样做之前,我想探索其他替代方案。

最佳答案

您可以使用函数进行更改并通过引用传递 Card 结构,如下所示:

func update(card: inout Card) {
    card.flag0 = "modify"
    card.flag1 = "modify"
    card.flag2 = "modify"
    card.flag3 = "modify"
}

var cards = Array<Card>()
cards.append(Card())

update(card: &cards[0])

甚至更好的是在 Card 类型中使用变异函数并将您的更改作为闭包传递:

struct Card {
    var flag0: String = ""
    var flag1: String = ""
    var flag2: String = ""
    var flag3: String = ""
    
    mutating func update(block: (inout Card) -> Void) {
        block(&self)
    }
}
    
var cards = Array<Card>()
cards.append(Card())

cards[0].update {
    $0.flag0 = "modify"
    $0.flag1 = "modify"
    $0.flag2 = "modify"
    $0.flag3 = "modify"
}

更新:为了使第二种方法更加可重用,您可以定义如下协议(protocol):

protocol Updatable {
    mutating func update(block: (inout Self) -> Void)
}

extension Updatable {
    mutating func update(block: (inout Self) -> Void) {
        block(&self)
    }
}

并使 Card 结构符合它:

struct Card: Updatable {
    var flag0: String = ""
    var flag1: String = ""
    var flag2: String = ""
    var flag3: String = ""
}

那么你就可以像上面一样使用它了。

关于ios - 是否有可能创建对结构数组元素的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63485670/

相关文章:

html - ios UIWebView上的Textfield css内部阴影

iOS SpreadsheetView,旋转时切纸

ios - 如何在 Swift 中使图像与其旁边的文本具有相同的高度?

c - 这一系列的 C typedef/struct/union/enum 定义有什么意义?

swift - CGRectZero 与 CGRect.zeroRect?

iphone - 组织一个大项目——它是如何完成的?

iphone - glScissor(0,0,0,0) 硬崩溃 Apple iOS 设备

swift - 无法理解 watchkit 扩展崩溃

ios - 有没有办法使用 Foursquare API 按价格搜索 field ?

c# - 将带有 char* 的结构编码到 C#