【发布时间】: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所以,它是“推断其余部分”。