首页 > 解决方案 > Swift在方括号包装数组之后立即关闭做什么

问题描述

我正在关注 Apple 的 IOS dev 官方教程。我遇到了这个小块,无法绕开它。

Landmark是数据模型

@Published var landmarks: [Landmark]

var features: [Landmark]{
        landmarks.filter{$0.isFeatured}
    }

显然是一个以类型为成员features的数组。Landmarklandmarks.filter{$0.isFeatured}只是试图过滤掉那些Landmark具有其属性isFeatured的s true

但是我已经检查了 Swift 中数组的初始化,你看到的就像你使用var features = landmarks.filter($0.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{$0.isYes}
}

print(myArray2)

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

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

//var myArray5<MyStruct> = {myArray.filter($0.isYes)}
//
//print(myArray5)

var arrayB = myArray.filter{$0.isYes}
print(arrayB)

标签: arraysswiftinitializationclosures

解决方案


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

features实际上,是一个返回值的函数(省略了这个词,return因为它是单行);每次你说它都会重新运行features

可以写成

func features() -> [Landmark] {
    landmarks.filter{$0.isFeatured}
}

但人们有一种感觉,这比作为一种方法更好地表达为一种属性。

这是在操场上玩的一个更简单的案例:

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

推荐阅读