簡體   English   中英

Swift 無法在范圍內從本地包中找到“”

[英]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代碼沒問題。 很難從屏幕截圖中分辨出來,但可以嘗試以下三件事:

  1. 看來您在同一個工作區中有兩個項目。 您的包在pixelstv項目中被引用,因此您將無法從Pods項目訪問它。

  2. 您的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"
            
        ),
        
    ]
    
)

//
//

  1. 這可能是 Xcode 的一個怪癖——沒有識別更新的訪問控制,完全失去了類型檢查的能力,等等。嘗試清理構建文件夾、重建、重新啟動、重置包緩存,甚至刪除 + 重新添加包到項目。

Xcode 使用包依賴項(來自 GitHub)似乎相當可靠,但使用本地包會引入很多錯誤。 有些我只注意到在使用本地包幾天后構建就神秘地取消了 25% 的時間,並且 Xcode 崩潰可能是由於嘗試使用預覽時包加載循環造成的。 您也可以一次只在一個打開的項目或窗口中引用本地包,否則您將無法編輯或訪問該包。

如果您確實遇到問題,考慮在您的項目中開發 API 可能是個好主意,然后在它們完成后將它們移動到一個包中並將它們推送到 GitHub。

回應@JoakimDanielson 的評論:大多數情況下我同意,但 Xcode 的屏幕截圖可能已經揭示了這里的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM