Type uitdrukking is dubbelzinnig zonder meer context Swift

Ik krijg een ‘Type uitdrukking is dubbelzinnig zonder meer context‘ voor dit deel van de code van een project dat ik probeer te upgraden naar de nieuwste Swift-versie. Ik kom er niet uit. Ik heb verschillende dingen geprobeerd, maar krijg het niet werkend.

Het probleem zit in de syntaxis van deze regel

let imageToDeleteParameters  = imagesToDelete.map { ["id": $0.id, "url": $0.url.absoluteString, "_destroy": true] }

Volledige code:

extension TutorialCreationRequest: WebserviceParametrable {
    func toParameters() -> [String: AnyObject] {
        let imageParameters = images.map { ["url": $0] }
        let imageToDeleteParameters  = imagesToDelete.map { ["id": $0.id, "url": $0.url.absoluteString, "_destroy": true] }
        return [
            "title": title,
            "is_draft": isDraft,
            "difficulty": difficulty,
            "duration": duration,
            "cost": cost,
            "user_id": userId,
            "description": description,
            "to_sell": toSell,
            "images": [imageParameters, imageToDeleteParameters].flatMap { $0 }
        ]
    }
}

Antwoord 1, autoriteit 100%

Dit gebeurt als je een functie hebt met verkeerde argumentnamen.

Voorbeeld:

functionWithArguments(argumentNameWrong: , argumentName2: )

en u heeft uw functie gedeclareerd als:

functionWithArguments(argumentName1: , argumentName2: ){}

Dit gebeurt meestal wanneer u de naam van een variabele wijzigt. Zorg ervoor dat je refactoren wanneer je dat doet.


Antwoord 2, autoriteit 60%

Dit kan gebeuren als eendeel van uw gemarkeerde methode of eigenschap probeert toegang te krijgen tot een eigenschap of methode met het verkeerde type.

Hier is een checklist voor het oplossen van problemen, zorg ervoor:

  • het type argumenten komt overeen met de oproepsite en de implementatie.
  • de argumentnamen komen overeen in de oproepsite en implementatie.
  • de naam van de methode komt overeen in de aanroepsite en implementatie.
  • de geretourneerde waarde van een eigenschap of methode komt overeen met het gebruik en de implementatie (dwz: enumerated())
  • je hebt geen gedupliceerde methode met mogelijk dubbelzinnige typen, zoals met protocollen of generieke geneesmiddelen.
  • de compiler kan het juiste type afleiden bij gebruik van type-inferentie.

Een strategie

  • Probeer je methode op te splitsen in een groter aantal eenvoudigere methoden/implementaties.

Stel bijvoorbeeld dat u compactMapuitvoert op een reeks aangepaste typen. In de afsluiting die u doorgeeft aan de compactMap-methode, initialiseert u en retourneert u een andere aangepaste struct. Wanneer je deze foutmelding krijgt, is het moeilijk om te zien welk deel van je code aanstootgevend is.

  • Voor foutopsporingsdoeleinden kunt u een for in-lus gebruiken in plaats van compactMap.
  • in plaats van de argumenten rechtstreeks door te geven, kunt u ze toewijzen aan constanten in de for-lus.

Op dit punt kun je tot het besef komen, bijvoorbeeld dat in plaats van het eigendom dat je dacht toe te wijzen, er daadwerkelijk een eigendom op stond met de werkelijke waarde die je wilde doorgeven.


Antwoord 3, autoriteit 48%

Geen antwoord op dezevraag, maar toen ik hier kwam op zoek naar de fout, kunnen anderen dit ook nuttig vinden:

Voor mij kreeg ik deze Swift-fout toen ik probeerde de for (index, object)-lus op een array te gebruiken zonder het onderdeel .enumerated()toe te voegen. ..


Antwoord 4, autoriteit 24%

De compiler kan er niet achter komen welk type de Dictionary moet maken, omdat het niet homogeen is. Je hebt verschillende soorten waarden. De enige manier om dit te omzeilen is door er een [String: Any]van te maken, waardoor alles zo onhandig wordt.

return [
    "title": title,
    "is_draft": isDraft,
    "difficulty": difficulty,
    "duration": duration,
    "cost": cost,
    "user_id": userId,
    "description": description,
    "to_sell": toSell,
    "images": [imageParameters, imageToDeleteParameters].flatMap { $0 }
] as [String: Any]

Dit is een baan voor een struct. Het zal het werken met deze gegevensstructuur enorm vereenvoudigen.


Antwoord 5, autoriteit 12%

Ik kreeg deze melding toen het type functieparameter niet paste. In mijn geval was het een String in plaats van een URL.


Antwoord 6, autoriteit 6%

Ik kreeg deze foutmelding toen ik een spatie voor een komma plaatste in de parameters bij het aanroepen van een functie.

Ik gebruikte bijvoorbeeld:

myfunction(parameter1: parameter1 , parameter2: parameter2)

Terwijl het had moeten zijn:

myfunction(parameter1: parameter1, parameter2: parameter2)

Door de spatie te verwijderen, is de foutmelding verdwenen


Antwoord 7, autoriteit 4%

Expliciet aangeven van de invoer voor die mapping-functie zou voldoende moeten zijn:

let imageToDeleteParameters  = imagesToDelete.map {
    (whatever : WhateverClass) -> Dictionary<String, Any> in
    ["id": whatever.id, "url": whatever.url.absoluteString, "_destroy": true]
}

Vervang de echte klasse van “$0” voor “WhateverClass” in dat codefragment en het zou moeten werken.


Antwoord 8, autoriteit 4%

Voor mij was het geval Type gevolgtrekking
Ik heb de functieparameters gewijzigd van int To float, maar heb de aanroepende code niet bijgewerkt en de compiler heeft me niet gewaarschuwd voor het verkeerde type dat aan de functie is doorgegeven

Vóór

func myFunc(param:Int, parma2:Int) {}

Na

func myFunc(param:Float, parma2:Float) {}

Belcode met fout

var param1:Int16 = 1
var param2:Int16 = 2
myFunc(param:param1, parma2:param2)// error here: Type of expression is ambiguous without more context

Oplossen:

var param1:Float = 1.0f
var param2:Float = 2.0f
myFunc(param:param1, parma2:param2)// ok!

Antwoord 9, autoriteit 2%

In mijn geval werd deze foutmelding getoond wanneer ik geen optionele eigenschap aan constructor heb toegevoegd.

struct Event: Identifiable, Codable {
    var id: String
    var summary: String
    var description: String?
    // also has other props...
    init(id: String, summary: String, description: String?){
        self.id = id
        self.summary = summary
        self.description = description
    }
}
// skip pass description
// It show message "Type of expression is ambiguous without more context"
Event(
    id: "1",
    summary: "summary",
)
// pass description explicity pass nil to description
Event(
    id: "1",
    summary: "summary",
    description: nil
)

maar het lijkt er altijd op dat het niet is voorgekomen.

Ik test deze code in mijn speeltuin, het toont een waarschuwing over meer concreet

var str = "Hello, playground"
struct User {
    var id: String
    var name: String?
    init(id: String, name: String?) {
        self.id = id
        self.name = name
    }
}
User(id: "hoge") // Missing argument for parameter 'name' in call

Antwoord 10, autoriteit 2%

Je hebt twee " "vóór de =

let imageToDeleteParameters  = imagesToDelete.map { ["id": $0.id, "url": $0.url.absoluteString, "_destroy": true] }

Antwoord 11

In mijn geval gebeurde het met NSFetchedResultsController en de reden was dat ik de NSFetchedResultsController voor een ander model definieerde dan ik het verzoek voor de initialisatie heb gemaakt (RemotePlaylist vs. Playlist):

 var fetchedPlaylistsController:NSFetchedResultsController<RemotePlaylist>!

maar startte het met een verzoek om een andere afspeellijst:

let request = Playlist.createFetchRequest()
fetchedPlaylistsController = NSFetchedResultsController(fetchRequest: request, ...

Antwoord 12

In mijn geval kwam ik deze fout tegen toen ik een distributie-build aan het maken was, en een klasse verwees naar Debug only context-methode.

Zoiets. Probeer de onderstaande klasse te compileren voor de distributie-build.

class MyClass {
   func sayHello() {
      helloWorld()
    }
   #if DEBUG
    func helloWorld() {
         print("Hello world")
    }
   #endif
}

Antwoord 13

In mijn geval hadden de argumenten die ik doorgaf optionele String-waarden. Het opgeven van een standaardwaarde om op terug te vallen (in het geval dat de waarde nilis) loste dit probleem voor mij op.

Ik heb dit gewijzigd –

router?.pushToDetailsScreen(
gitHubRepositoryOwnerName: gitHubRepositoryDetails?[index].owner?.login,
gitHubRepositoryName: gitHubRepositoryDetails?[index].name,
avatarUrl: gitHubRepositoryDetails?[index].owner?.avatar_url)

naar dit –

router?.pushToDetailsScreen(
gitHubRepositoryOwnerName: gitHubRepositoryDetails?[index].owner?.login ?? "",
gitHubRepositoryName: gitHubRepositoryDetails?[index].name ?? "",
avatarUrl: gitHubRepositoryDetails?[index].owner?.avatar_url ?? "")

Antwoord 14

Als antwoord van theEye is het geen antwoord op dezevraag, maar aangezien ik hier ook kwam op zoek naar de fout bij het posten van mijn zaak, omdat anderen dit misschien ook nuttig vinden:

Ik kreeg deze foutmelding toen ik per ongeluk een waarde van twee verschillende typen probeerde te berekenen.

In mijn geval probeerde ik een CGFloatte delen door een Double

Other episodes