我是swift软件包的新手,我试图创建一个简单的函数来授权用户,但是Xcode似乎找不到我的"ApiCalls"结构,尽管我已经将所有内容设置为公共,并且我遵循了如何制作软件包的教程。我一直收到这个错误
这是我的包裹
我哪里做错了?
我试着查找这个,主要问题是我的结构体和变量没有设置为public,但是即使修改Xcode也找不到它。
更新:我将其设置为静态,但仍然收到相同的错误消息:
public struct ApiCalls {
public init(currentAPIDomain: String = "my.url") {
ApiCalls.currentAPIDomain = currentAPIDomain
}
public static var currentAPIDomain : String = "https://castle-learning-1541513232785.appspot.com/"
public static func RestApiRequest<T:Decodable>(method:ApiCallsRequestMethods, endpoint: String, model: T.Type, requirements: ApiCallsRequestRequirements) async throws -> T {
guard var endpointURL = URL(string: currentAPIDomain + endpoint) else { throw ApiCallErrors.DomainMalformed }
if requirements.subtitles != nil && requirements.subtitles == true {
endpointURL = URL(string: endpoint)!
}
var request = URLRequest(url: endpointURL)
switch method {
case .GET:
request.httpMethod = "GET"
case .POST:
request.httpMethod = "POST"
case .PUT:
request.httpMethod = "PUT"
case .DELETE:
request.httpMethod = "DELETE"
}
if requirements.subtitles != nil && requirements.subtitles == true {
request.addValue("fdD7F8Orql9WBolf9BgjrYIDFcFhH9Hz", forHTTPHeaderField: "Api-Key")
}
if Array(requirements.token.keys)[0] == true {
request.addValue("Bearer \(requirements.token[true]!)", forHTTPHeaderField: "Authorization")
}
if Array(requirements.body.keys)[0] == true {
let body: [String:Any] = requirements.body[true]!
let finalBody = try! JSONSerialization.data(withJSONObject: body)
request.httpBody = finalBody
}
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
guard let (data, response) = try? await URLSession.shared.data(for: request) else {
throw ApiCallErrors.InvalidData
}
guard (response as? HTTPURLResponse)?.statusCode == 200 else { throw ApiCallErrors.Unexpected }
guard let decodedData = try? JSONDecoder().decode(T.self, from: data) else {
throw ApiCallErrors.ErrorDecoding
}
return decodedData
}
public static func login(username: String, password: String) async throws -> String {
do {
let results = try await RestApiRequest(method: .GET, endpoint: "ptv/login", model: Login_SignUp_Model.self, requirements: ApiCallsRequestRequirements(token: [false : ""], body: [true : ["email" : username, "password":password]]))
return results.message
} catch {
throw error
}
}
}
1条答案
按热度按时间zed5wv101#
这个问题与你的方法是静态的无关,但访问控制很重要。你的Swift包被认为是一个独立的模块,因此任何低于public的内容都无法从其他地方(例如你的应用)访问。
你原来的
APICalls
代码很好,从截图上很难判断,但是这里有三件事可以尝试:1.您似乎在同一工作区中有两个项目。您的包在
pixelstv
项目中被引用,因此您将无法从Pods
项目访问它。1.您的
Package.swift
文件中可能存在错误。它应遵循以下基本结构:1.这可能是Xcode的一个怪癖-没有识别更新的访问控制,完全失去了类型检查的能力,等等。尝试清理构建文件夹,重建,重新启动,重置包缓存,甚至删除+重新添加包到项目中。
使用软件包依赖性,Xcode看起来相当可靠(来自GitHub),但是使用本地包会引入很多bug。我注意到一些使用本地包才几天的地方就有25%的构建会神秘地取消,Xcode崩溃可能是因为在尝试使用预览时出现了包加载循环。你也可以一次只在一个打开的项目或窗口中引用本地包。否则您将无法编辑或访问该包。
如果你真的遇到了问题,考虑在项目内部开发API可能是个好主意,一旦完成就把它们移到一个包里,然后推送到GitHub。
回应@JoakimDanielson评论:大多数情况下我都同意,但Xcode的截图可能已经揭示了这里的问题。