Arrays 通过数组删除变量

Arrays 通过数组删除变量,arrays,swift,Arrays,Swift,我试图删除数组中许多变量的值: var fbUserID = String() var fbUserName = String() var meNickname = String() var userIDOneSignal = String() var deleteStrings = [fbUserID, fbUserName, meNickname, userIDOneSignal] 有没有可能做到这一点: for i in deleteStrings { i.removeAll(

我试图删除数组中许多变量的值:

var fbUserID = String()
var fbUserName = String()
var meNickname = String()
var userIDOneSignal = String()

var deleteStrings = [fbUserID, fbUserName, meNickname, userIDOneSignal]
有没有可能做到这一点:

for i in deleteStrings {
    i.removeAll()//remove all as in remove the values of each variable
}

我还尝试过使用
deleteStrings[I].removeAll()

只需删除数组元素即可

deleteStrings.removeAll()

只需删除数组元素

deleteStrings.removeAll()

由于值语义,您无法从数组中变异变量(作为指针)

使用结构而不是数组

struct User {

    var fbUserID = "12"
    var fbUserName = "Foo"
    var meNickname = "Baz"
    var userIDOneSignal = "123"

    mutating func clear()
    {
        fbUserID = ""
        fbUserName = ""
        meNickname = ""
        userIDOneSignal = ""
    }
}

var user = User()
print(user.fbUserID) // "12"
user.clear()

user.fbUserID = ""
print(user.fbUserID) // ""

由于值语义,您无法从数组中变异变量(作为指针)

使用结构而不是数组

struct User {

    var fbUserID = "12"
    var fbUserName = "Foo"
    var meNickname = "Baz"
    var userIDOneSignal = "123"

    mutating func clear()
    {
        fbUserID = ""
        fbUserName = ""
        meNickname = ""
        userIDOneSignal = ""
    }
}

var user = User()
print(user.fbUserID) // "12"
user.clear()

user.fbUserID = ""
print(user.fbUserID) // ""

如果要删除/删除变量值,请使用optional,否则变量值只会在超出范围时被删除或不存在

例如:

var a: Int? = 5  // it have default value 5
a = nil // Now a have nil which is kind of telling that it contains nothing which is what you want to achieve
现在来回答你的问题

有没有可能做到这一点:

for i in deleteStrings {
    i.removeAll()//remove all as in remove the values of each variable
}
在字符串数组上进行迭代,然后针对每个字符串,尝试删除所有
字符。首先,你会得到一个错误

 error: cannot use mutating member on immutable value: 'i' is a 'let' constant
即使您将使用
var
进行更正,它也无法实现您试图执行的操作,即
我想删除变量值
,因为您的
fbUserID…
所有其他变量都将有您初始化的数据副本

现在怎么做呢

  • 您可以使用optional来实现它

    var fbUserID: String? = String()
    var fbUserName: String? = String()
    var meNickname: String? = String()
    var userIDOneSignal: String? = String()
    
    // To delete you will need to assign them nil
    fbUserId = nil
    

同样,您不能在循环中执行这些操作,因为
var
属于值类型,当您将其添加到列表中时,会添加它们的副本。

如果您要删除/删除变量值,请使用可选选项,否则您的变量值只会在超出范围时被删除或不存在

例如:

var a: Int? = 5  // it have default value 5
a = nil // Now a have nil which is kind of telling that it contains nothing which is what you want to achieve
现在来回答你的问题

有没有可能做到这一点:

for i in deleteStrings {
    i.removeAll()//remove all as in remove the values of each variable
}
在字符串数组上进行迭代,然后针对每个字符串,尝试删除所有
字符。首先,你会得到一个错误

 error: cannot use mutating member on immutable value: 'i' is a 'let' constant
即使您将使用
var
进行更正,它也无法实现您试图执行的操作,即
我想删除变量值
,因为您的
fbUserID…
所有其他变量都将有您初始化的数据副本

现在怎么做呢

  • 您可以使用optional来实现它

    var fbUserID: String? = String()
    var fbUserName: String? = String()
    var meNickname: String? = String()
    var userIDOneSignal: String? = String()
    
    // To delete you will need to assign them nil
    fbUserId = nil
    

同样,您不能重复执行这些操作,因为
var
属于值类型,当您将其添加到列表中时,会添加它们的副本。

如果您的
类继承自
NSObject
,您可以使用以下名称访问字段:

class User: NSObject {
    var fbUserID = String()
    var fbUserName = String()
    var meNickname = String()
    var userIDOneSignal = String()

    var deleteStrings = ["fbUserID", "fbUserName", "meNickname", "userIDOneSignal"]

    func clearAll() {
        deleteStrings.forEach { setValue("", forKey: $0) }
    }
}

let user = User()
user.fbUserID = "12345"
user.fbUserName = "Joseph Doe"
user.meNickname = "Joe"

print(user.meNickname)  // "Joe"

user.clearAll()

print(user.meNickname)  // ""

如果您的
类继承自
NSObject
,则可以使用按名称访问字段:

class User: NSObject {
    var fbUserID = String()
    var fbUserName = String()
    var meNickname = String()
    var userIDOneSignal = String()

    var deleteStrings = ["fbUserID", "fbUserName", "meNickname", "userIDOneSignal"]

    func clearAll() {
        deleteStrings.forEach { setValue("", forKey: $0) }
    }
}

let user = User()
user.fbUserID = "12345"
user.fbUserName = "Joseph Doe"
user.meNickname = "Joe"

print(user.meNickname)  // "Joe"

user.clearAll()

print(user.meNickname)  // ""

OP需要非可选的空字符串。“在这种情况下,选择是一个不好的建议。”瓦迪安我想,他问了一些清空字符串的方法。可选是表示它的一种方式。顺便说一句,谢谢你的回复。空字符串和可选的
nil
字符串是两个完全不同的东西。面对非可选值的巨大好处:代码永远不会在运行时崩溃,编译器也不会在编译时分配可选值。我同意。我关心的是“删除变量”!='空字符串'。我认为“Delete Variable”是指“NULL/NIL”。OP需要非可选的空字符串。“在这种情况下,选择是一个不好的建议。”瓦迪安我想,他问了一些清空字符串的方法。可选是表示它的一种方式。顺便说一句,谢谢你的回复。空字符串和可选的
nil
字符串是两个完全不同的东西。面对非可选值的巨大好处:代码永远不会在运行时崩溃,编译器也不会在编译时分配可选值。我同意。我关心的是“删除变量”!='空字符串'。我认为“Delete Variable”是指“NULL/NIL”。为什么不简单地用let声明所有属性,而不是“clear”只是实例化一个新的struct@LeoDabus是的,这样更好,但我想保留问题的基本“工作流”。为什么不简单地用let声明所有属性,而不是“clear”只实例化一个新属性struct@LeoDabus对这更好,但我想保留问题的基本“工作流程”。你应该使用字典你应该使用字典