![](/img/trans.png)
[英]Xcode giving “Cannot find type 'TYPE' in scope” errors with Swift Package
[英]Swift Cannot find "" in Scope, from local Package
我是 swift 包的新手,我試圖創建一個簡單的函數來授權用戶,但 Xcode 似乎無法找到我的“ApiCalls”結構,即使我已將所有內容設置為公開,我也遵循了一個教程如何做一個包。 我一直收到這個錯誤
這是我的包裹
我究竟做錯了什么?
我試着查了一下,主要問題是我的結構和變量沒有設置為公開。 但即使更改 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
}
}
}
該問題與您的靜態方法無關,但訪問控制很重要。 你的 Swift 包被認為是一個單獨的模塊,因此任何低於 public 的東西都無法從其他地方訪問(例如你的應用程序)。
您的原始APICalls
代碼沒問題。 很難從屏幕截圖中分辨出來,但可以嘗試以下三件事:
看來您在同一個工作區中有兩個項目。 您的包在pixelstv
項目中被引用,因此您將無法從Pods
項目訪問它。
您的Package.swift
文件中可能有問題。 它應該遵循這個基本結構:
// swift-tools-version: 5.7
//
// APIName: Configuration
// Developed by _
//
// MARK: - Imports
import PackageDescription
//
//
// MARK: - Variables
let package = Package (
name: "APIName",
products: [
.library (
name: "APIName",
targets: [ "TargetName" ]
),
],
dependencies: [ ],
targets: [
.target (
name: "APIName",
dependencies: [ ],
path: "sources"
),
.testTarget (
name: "APINameTests",
dependencies: [ "APIName" ],
path: "tests"
),
]
)
//
//
Xcode 使用包依賴項(來自 GitHub)似乎相當可靠,但使用本地包會引入很多錯誤。 有些我只注意到在使用本地包幾天后構建就神秘地取消了 25% 的時間,並且 Xcode 崩潰可能是由於嘗試使用預覽時包加載循環造成的。 您也可以一次只在一個打開的項目或窗口中引用本地包,否則您將無法編輯或訪問該包。
如果您確實遇到問題,考慮在您的項目中開發 API 可能是個好主意,然后在它們完成后將它們移動到一個包中並將它們推送到 GitHub。
回應@JoakimDanielson 的評論:大多數情況下我同意,但 Xcode 的屏幕截圖可能已經揭示了這里的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.