Arrays 如何从Swift中的字符串数组中筛选对象

Arrays 如何从Swift中的字符串数组中筛选对象,arrays,swift,Arrays,Swift,我有一个allMenuItems数组,如下所示,我正试图从Id数组中筛选它。如何在Swift中实现这一点?我对高阶函数有一些了解,但到目前为止,我无法成功地过滤这个函数。欢迎就如何实现这一目标提出任何建议,谢谢 struct MenuItems { var id: String var name: String init() { self.id = "" self.name = "" } } var m1 = MenuItems

我有一个allMenuItems数组,如下所示,我正试图从Id数组中筛选它。如何在Swift中实现这一点?我对高阶函数有一些了解,但到目前为止,我无法成功地过滤这个函数。欢迎就如何实现这一目标提出任何建议,谢谢

struct MenuItems {
    var id: String
    var name: String

    init() {
        self.id = ""
        self.name = ""
    }
}

var m1 = MenuItems()
m1.id = "1"
m1.name = "Name 1"

var m2 = MenuItems()
m2.id = "2"
m2.name = "Name 2"

var m3 = MenuItems()
m3.id = "3"
m3.name = "Name 3"

var allMenuItems: [MenuItems] = [m1, m2, m3] // [{id "1", name "Name 1"}, {id "2", name "Name 2"}, {id "3", name "Name 3"}]

var anArrayOfIds: [String] = ["1", "3"]
过滤后的输出将是:

var filteredMenuItems: [MenuItems] = [m1, m3] // [{id "1", name "Name 1"}, {id "3", name "Name 3"}]
有什么建议吗?

怎么样

let filteredMenuItems=allMenuItems.filter{anArrayOfIds.contains($0.id)}

这给了我带1和3的项目

我冒昧地更新了您的代码:

struct MenuItems {
    let id: String
    let name: String
}

let m1 = MenuItems(id: "1", name: "Name 1")
let m2 = MenuItems(id: "2", name: "Name 2")
let m3 = MenuItems(id: "3", name: "Name 3")

let allMenuItems = [m1, m2, m3]
let anArrayOfIds: [String] = ["1", "3"]

let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id)}
希望对你有所帮助,怎么样

let filteredMenuItems=allMenuItems.filter{anArrayOfIds.contains($0.id)}

这给了我带1和3的项目

我冒昧地更新了您的代码:

struct MenuItems {
    let id: String
    let name: String
}

let m1 = MenuItems(id: "1", name: "Name 1")
let m2 = MenuItems(id: "2", name: "Name 2")
let m3 = MenuItems(id: "3", name: "Name 3")

let allMenuItems = [m1, m2, m3]
let anArrayOfIds: [String] = ["1", "3"]

let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id)}

希望这对您有所帮助

您可以这样做:

let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id) }

我建议你:

  • 删除无意义的初始值设定项
  • id
    设为整数
  • 如果属性在初始化后不会更改,则使用
    let
    而不是
    var
  • 将anarrayofid设置为集合而不是数组,因为
    contains
    方法将是O(1)而不是O(n)
实现所有这些建议将为您提供以下代码:

struct MenuItems {
    let id: Int
    let name: String
}

let m1 = MenuItems(id: 1, name: "Name 1")
let m2 = MenuItems(id: 2, name: "Name 2")
let m3 = MenuItems(id: 3, name: "Name 3")

let allMenuItems: [MenuItems] = [m1, m2, m3]

var aSetOfIds: Set<Int> = [1, 3]  //I used a var if aSetOfIds could be changed

var filteredMenuItems = allMenuItems.filter { aSetOfIds.contains($0.id) }
结构菜单项{ 让id:Int let name:String } 设m1=MenuItems(id:1,name:“name 1”) 设m2=MenuItems(id:2,名称:“名称2”) 设m3=菜单项(id:3,名称:“名称3”) 让所有MenuItems:[MenuItems]=[m1,m2,m3] var-aSetOfIds:Set=[1,3]//如果可以更改aSetOfIds,我就使用了一个var var filteredMenuItems=allMenuItems.filter{aSetOfIds.contains($0.id)}
您可以这样做:

let filteredMenuItems = allMenuItems.filter { anArrayOfIds.contains($0.id) }

我建议你:

  • 删除无意义的初始值设定项
  • id
    设为整数
  • 如果属性在初始化后不会更改,则使用
    let
    而不是
    var
  • 将anarrayofid设置为集合而不是数组,因为
    contains
    方法将是O(1)而不是O(n)
实现所有这些建议将为您提供以下代码:

struct MenuItems {
    let id: Int
    let name: String
}

let m1 = MenuItems(id: 1, name: "Name 1")
let m2 = MenuItems(id: 2, name: "Name 2")
let m3 = MenuItems(id: 3, name: "Name 3")

let allMenuItems: [MenuItems] = [m1, m2, m3]

var aSetOfIds: Set<Int> = [1, 3]  //I used a var if aSetOfIds could be changed

var filteredMenuItems = allMenuItems.filter { aSetOfIds.contains($0.id) }
结构菜单项{ 让id:Int let name:String } 设m1=MenuItems(id:1,name:“name 1”) 设m2=MenuItems(id:2,名称:“名称2”) 设m3=菜单项(id:3,名称:“名称3”) 让所有MenuItems:[MenuItems]=[m1,m2,m3] var-aSetOfIds:Set=[1,3]//如果可以更改aSetOfIds,我就使用了一个var var filteredMenuItems=allMenuItems.filter{aSetOfIds.contains($0.id)}
您可以使用过滤器和包含

let filtered = allMenuItems.filter( { anArrayOfIds.contains($0.id) })

您可以使用筛选器和contains

let filtered = allMenuItems.filter( { anArrayOfIds.contains($0.id) })

首先,请不要在像这样的结构中使用奇怪的语法

init() {
     self.id = ""
     self.name = ""
}
删除
init
方法并使用隐式memberwise初始值设定项创建项,方法是以单数形式命名表示单个对象的结构:

let m1 = MenuItem(id: "1", name: "Name 1")
您甚至可以将成员声明为常量

struct MenuItem {
    let id, name : String
}
不要注释编译器可以推断的类型


使用另一个
id
值数组过滤数组

let filteredMenuItems = allMenuItems.filter{ anArrayOfIds.contains($0.id) }

首先,请不要在像这样的结构中使用奇怪的语法

init() {
     self.id = ""
     self.name = ""
}
删除
init
方法并使用隐式memberwise初始值设定项创建项,方法是以单数形式命名表示单个对象的结构:

let m1 = MenuItem(id: "1", name: "Name 1")
您甚至可以将成员声明为常量

struct MenuItem {
    let id, name : String
}
不要注释编译器可以推断的类型


使用另一个
id
值数组过滤数组

let filteredMenuItems = allMenuItems.filter{ anArrayOfIds.contains($0.id) }

var-id:String
self.id=”“
,这在Swift中是非常糟糕的做法。不要在不需要的地方添加易变性,也不要使用非感官默认值(名称为“
)@Alexander-谢谢。这不是实际使用的代码。
var-id:String
self.id=”“
,这在Swift中是非常糟糕的做法。不要在不需要的地方添加易变性,也不要使用非感官默认值(名称为“
)@Alexander-谢谢。这不是实际使用的代码。是的,抱歉。这不是实际的代码,是匆忙拼凑起来的。不过,我没有借口。是的,道歉。这不是实际的代码,是匆忙拼凑起来的。不过,我没有任何借口。正如前面提到的,这是匆忙起草的,我已经为此受到了抨击。id实际上是一个GUID,而这些代码本身都不是真的。不过,我想我还是会投下票的。谢谢你的回复。如前所述,这是仓促起草的,我已经接受了抨击。id实际上是一个GUID,而这些代码本身都不是真的。不过,我想我还是会投下票的。谢谢你的回复。