Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:通过引用或“影响结构”;别名";对一个变量_Swift_Struct_Reference - Fatal编程技术网

Swift:通过引用或“影响结构”;别名";对一个变量

Swift:通过引用或“影响结构”;别名";对一个变量,swift,struct,reference,Swift,Struct,Reference,我必须更新结构,但此结构需要从我的viewController中找到一个长表达式: let theMessage:Message? = self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) })? .msgs.first(where: { $0 == msg }) 我想改变这个结构的一个属性,但不是它的副本,我想更新它“在哪里”,即在messageSections[].msgs[]

我必须更新结构,但此结构需要从我的viewController中找到一个长表达式:

let theMessage:Message? = self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) })?
        .msgs.first(where: { $0 == msg })
我想改变这个结构的一个属性,但不是它的副本,我想更新它“在哪里”,即在messageSections[].msgs[]

这里的问题是,如果我在上面的代码之后尝试此代码:

theMessage.status = .NOT_SENT 
只有本地副本将被更新,而不是messageSections[].msgs[]中的真实副本。因此,当我重新加载collectionView时,一切都没有改变

我可以

self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) })?
        .msgs.first(where: { $0 == msg }).status = .NOT_SENT
但是如果我必须在函数中多次操作这个属性,我不想每次都重写整个表达式。所以我要找的是类似于C的东西:

let theMessage:Message?* = &self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) })?
    .msgs.first(where: { $0 == msg })
if(theMessage != NULL) 
    theMessage->status = .NOT_SENT 

我在其他问题中看到了我可以使用的&参数前和参数名前的inout,但它仅用于函数调用。我正在寻找一种在影响变量时为大表达式创建别名的方法,以避免每次重新写入它。

您可以使用
firstIndex
获取数组中元素的索引,然后使用检索到的索引直接访问元素

if let messageSectionIndex = self.messageSections.first(where: { $0.date == DateDMY(fromNSDate:msg.date) }), let messageIndex = self.messageSections[messageSectionIndex].msgs.firstIndex(where: { $0 == msg }) {
    self.messageSections[messageSectionIndex].msgs[messageIndex].status = .NOT_SENT
}

必须得到指数而不是元素
firstIndex
@Kevin lol好方法我甚至没想过谢谢我会这么做:)