【问题标题】:the type in a swift generic function can be decided by the returned value?swift泛型函数中的类型可以由返回值决定吗?
【发布时间】:2021-07-28 17:04:28
【问题描述】:

我的问题来自这个苹果教程项目: https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation

Landmark 是一个模态结构:

struct Landmark: Hashable, Codable , Identifiable{
    ....
    var id: Int
    var name: String
    var park: String
    var state: String
    var description: String
    ...
}

从 json 文件加载地标列表。

var landmarks: [Landmark] = load("landmarkData.json")

加载函数是一个泛型函数:

func load<T: Decodable>(_ filename: String) -> T {
    ...
    file = Bundle.main.url(forResource: filename, withExtension: nil)
    data = try Data(contentsOf: file)
    let decoder = JSONDecoder()
    return try decoder.decode(T.self, from: data)
    ...
}

以下是“landmarkData.json”文件的内容:

    [
    {
        "name": "Kuring-gai",
        "category": "Forest",
        "city": "Sydney",
        "state": "NSW",
        "id": 1000,
        "isFeatured": true,
        "isFavorite": true,
        "park": "Kuring-gai National Park",
        "coordinates": {
            "longitude": -116.166868,
            "latitude": 34.011286
        },
        "description": "forest.",
    "imageName": "kuringai"
    },
    ...
]

Landmark 没有作为参数传递给函数“load”。 T的类型是如何决定的?类型是否由返回值决定,何时调用?谢谢!

【问题讨论】:

  • 其实Generic类型是由传值类型决定的。
  • 你告诉编译器返回值是什么,它是一个[Landmark],写成:var landmarks: [Landmark]。它符合Decodable 所以,它是“推断其余部分”。

标签: swift generics


【解决方案1】:

Swift type inference 能够确定load 应该返回什么类型,因为该类型在landmarks 的声明中明确说明。

省略类型会报错:

var landmarks = load("landmarkData.json") // Generic parameter 'T' could not be inferred

但你也可以写:

var landmarks = load("landmarkData.json") as [Landmark]

如果您想了解更多关于这件事的信息,可以查看article

【讨论】:

  • 谢谢!那个链接就是我要找的。​​span>
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
相关资源
最近更新 更多