Swift 方括号包裹数组之后的闭包是做什么的

Swift what does the closure immediately after squared bracket wrapped array do

我正在学习Apple IOS dev 的官方教程。遇到这个小块,想不通。

Landmark是数据模型

@Published var landmarks: [Landmark]

var features: [Landmark]{
        landmarks.filter{[=11=].isFeatured}
    }

显然 features 是一个以 Landmark 类型作为其成员的数组。 landmarks.filter{[=16=].isFeatured} 只是试图过滤掉那些 属性 isFeaturedtrue.

Landmark

但是我检查了Swift中数组的初始化,你看到的就像你使用var features = landmarks.filter([=20=].isFeatured)一样。你几乎看不到任何 [ something ] { something }

的例子

示例代码是用闭包初始化数组的正确方法吗?

有兴趣亲身体验的朋友,可以在 playground 试试下面的玩具代码:

struct MyStruct: Codable {
    var isYes: Bool
    var name: String
}

let myArray = [
    MyStruct(isYes: true, name: "A"),
    MyStruct(isYes: true, name: "B"),
    MyStruct(isYes: false, name: "C"),
]

print("hello")
print(myArray)

var myArray2: [MyStruct]{
    myArray.filter{[=12=].isYes}
}

print(myArray2)

//var myArray3: [MyStruct] = myArray.filter([=12=].isYes)
//
//print(myArray3)

//var myArray4: [MyStruct] = {myArray.filter([=12=].isYes)}
//
//print(myArray4)

//var myArray5<MyStruct> = {myArray.filter([=12=].isYes)}
//
//print(myArray5)

var arrayB = myArray.filter{[=12=].isYes}
print(arrayB)

该代码中没有“初始化”。您正在查看计算变量 (属性)。

features 实际上是一个 函数 ,returns 是一个值(省略了单词 return,因为它是一个衬垫);每次你说 features.

时它都会重新运行

这个可以写成

func features() -> [Landmark] {
    landmarks.filter{[=10=].isFeatured}
}

但人们感觉将其表达为一种 属性 比作为一种方法更好。

这里有一个更简单的例子,可以在操场上玩:

struct Greeter {
    var greeting : String { "howdy" }
    func greet() -> String { "howdy" }
}
let greeter = Greeter()
print(greeter.greeting)
print(greeter.greet())