2017-06-22 40 views
-2

Je reçois deux erreurs lorsque j'essaie de définir le points de graphique de l'API Yahoo Finance en utilisant Swift. La première erreur indiqueSwift Error - 'Impossible d'invoquer la valeur du type' SwiftStockChart.LabelForValueGetter '(alias' (CGFloat) -> Chaîne ') avec la liste d'arguments' (Valeur: CGFloat) '

'ne peut invoquer la valeur de type 'SwiftStockChart.LabelForValueGetter'(alias' (CGFloat) -> String ') avec liste d'arguments '(Valeur: CGFloat)'

c'est en ligne

let text = labelForValue(value: minValue! + (maxValue! - minValue!)/CGFloat(verticalGridStep!) * CGFloat((i + 1))) 

Je reçois aussi une erreur disant

'ne peut invoquer la valeur de type 'SwiftStockChart.LabelForValueGetter'(alias' (Int) -> String ') avec liste d'arguments '(valeur: Int)'

Et cela est en ligne

let text = labelForIndex(index: i) 

Le code complet est:

func setChartPoints(points: [ChartPoint]) { 

    if points.isEmpty { return } 

    dataPoints = points 

    computeBounds() 


    if maxValue!.isNaN { maxValue = 1.0 } 

    for i in 0 ..< verticalGridStep! { 

     let yVal = axisHeight! + margin! - CGFloat((i + 1)) * axisHeight!/CGFloat(verticalGridStep!) 
     let p = CGPoint(x: (valueLabelPosition! == .right ? axisWidth! : 0), y: yVal) 

     let text = labelForValue(value: minValue! + (maxValue! - minValue!)/CGFloat(verticalGridStep!) * CGFloat((i + 1))) 

     let rect = CGRect(x: margin!, y: p.y + 2, width: self.frame.size.width - margin! * 2 - 4.0, height: 14.0) 
     let width = text.boundingRect(with: rect.size, 
             options: NSStringDrawingOptions.usesLineFragmentOrigin, 
             attributes:[NSFontAttributeName : valueLabelFont!], 
             context: nil).size.width 

     let xPadding = 6 
     let xOffset = width + CGFloat(xPadding) 

     let label = UILabel(frame: CGRect(x: p.x - xOffset + 5.0, y: p.y, width: width + 2, height: 14)) 
     label.text = text 
     label.font = valueLabelFont 
     label.textColor = valueLabelTextColor 
     label.textAlignment = .center 
     label.backgroundColor = valueLabelBackgroundColor! 

     self.addSubview(label) 
     axisLabels.append(label) 

    } 

    for i in 0 ..< horizontalGridStep! + 1 { 

     let text = labelForIndex(index: i) 

     let p = CGPoint(x: margin! + CGFloat(i) * (axisWidth!/CGFloat(horizontalGridStep!)) * 1.0, y: axisHeight! + margin!) 


     let rect = CGRect(x: margin!, y: p.y + 2, width: self.frame.size.width - margin! * 2 - 4.0, height: 14) 
     let width = text.boundingRect(with: rect.size, 
             options: NSStringDrawingOptions.usesLineFragmentOrigin, 
             attributes:[NSFontAttributeName : indexLabelFont!], 
             context: nil).size.width 

     let label = UILabel(frame: CGRect(x: p.x - 5.0, y: p.y + 5.0, width: width + 2, height: 14)) 
     label.text = text 
     label.font = indexLabelFont! 
     label.textAlignment = .left 
     label.textColor = indexLabelTextColor! 
     label.backgroundColor = indexLabelBackgroundColor! 

     self.addSubview(label) 
     axisLabels.append(label) 

    } 

Répondre

0

Guess: Vous utilisez un code, ou une documentation de lecture, conçu pour une version antérieure à Swift 3 de SwiftStockKit.

Ceci est une supposition car la question ne fournit pas suffisamment de détails pour être sûr. Donc, cela pourrait être faux!


La proposition Swift SE0111: Remove type system significance of function argument labels retiré l'importance des étiquettes d'argument dans les types de fonction et a été mis en œuvre à Swift 3.

SwiftStockKit comme actuellement sur le web définit labelForValue en utilisant:

typealias LabelForValueGetter = (value: CGFloat) -> String 
var labelForValue: LabelForValueGetter! 

cette ne compilera pas sous Swift 3, il doit être changé (comme une instruction de l'erreur du compilateur) à:

typealias LabelForValueGetter = (_ value: CGFloat) -> String 
var labelForValue: LabelForValueGetter! 

Maintenant, regardez votre erreur:

Cannot invoke value of type 'SwiftStockChart.LabelForValueGetter' (aka'(CGFloat) -> String') with argument list '(Value:CGFloat)

Le premier a ici pas d'étiquette d'argument, la liste des arguments que vous fournissez ne - donc un décalage, retirez l'étiquette dans la liste des arguments.

Si vous utilisez une copie de SwiftStockKit qui a été mise à jour pour Swift 3 mais que vous codez pour une version antérieure, vous obtiendrez probablement beaucoup plus d'erreurs que les 2 que vous signalez ici.

HTH

+0

Cela a corrigé la première erreur, mais pas la seconde? Avez-vous des suggestions sur let let = labelForIndex (index: i)? –

+0

C'est le même problème, juste avec un type de fonction différent. Il pourrait facilement y en avoir plus, vous pourriez peut-être comparer (diff/FileMerge) la source du SwiftStockKit que vous utilisez avec celle liée ci-dessus, car je suppose que votre documentation est pour la version web (avant Swift 3). – CRD

0

Je semble que vous essayez de diviser une chaîne par un CGFloat.

Cette ligne

let text = labelForValue(value: minValue! + (maxValue! - minValue!)/CGFloat(verticalGridStep!) * CGFloat((i + 1))) 

a une structure de type:

String/CGFloat * CGFloat 

Qu'est-ce que vous essayez de faire exactement avec cette ligne? Je peux éditer ma réponse avec une solution si vous pouvez me donner plus de contexte. Aussi seriez-vous prêt à créer un lien vers la bibliothèque que vous utilisez.

+0

Je suis en train de définir des points de graphique sur un graphique de l'API Yahoo en utilisant Alamofire –

+0

Voulez-vous me donner plus de code? –

+0

Quelle est la division pour though? Essayez-vous de diviser les flotteurs, puis les transformer en une chaîne? –