質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1854閲覧

swiftのchartsで、円グラフを作りそのラベルを編集しているのですが、、、

Hayato1201

総合スコア220

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/10/12 03:47

ライブラリ、ChartsのPieChartを使っていて以下の様に

Swift

1 let dataSet = PieChartDataSet(values: entries, label: "") 2 dataSet.valueFormatter = CustomLabelFomatter(types: labels, values: values)

クラスCustomLabelFomatterを使いラベルのフォーマットを変更しています。

CustomLabelFomatterを以下に示します

Swift

1class CustomLabelFomatter: NSObject, IValueFormatter { 2 3 let types: [String] 4 let values: [Double] 5 6 init(types: [String], values: [Double]) { 7 self.types = types 8 self.values = values 9     print(types) 10 print(values) 11 } 12 13 func convert(value: Double) -> String { 14 guard let convertedString = values 15 .enumerated() 16 .filter({$0.element == value}) 17 .map({ tuple -> String in 18 print(tuple) 19 20 let index = tuple.offset 21 let type = types[index] 22 if value < 3600 { 23 return "" 24 } 25 26 print(type) 27 switch type { 28 case "blank": 29 return "" 30 default: 31 return "(type)\n(round((value/3600)*10)/10)h" 32 } 33 34 }).first else {fatalError()} 35 36 return convertedString 37 } 38 39 func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String { 40 41 return convert(value: value) 42 } 43}

しかしこれで困ったことがありました。例えばtypesとvaluesが以下の様に、
["blank", "テスト", "blank", "筋トレ", "blank", "バイト", "blank", "テスト2", "blank"]
[0.0, 18000.0, 39600.0, 5400.0, 3600.0, 5400.0, 5400.0, 600.0, 8399.0]

となっていた場合5400.0というvalueが3つあり、.filter({$0.element == value})で3つ分実行されてしまい、結局どれも最初の”筋トレ”だけがラベルとして返されてしまいます。
ここでうまく正しいラベルを返せる様にするにはどうすればいいでしょうか・・・?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

以下の様にして解決しました。。。

Swift

1class CustomLabelFomatter: NSObject, IValueFormatter { 2 3 let types: [String] 4 let values: [Double] 5 let countnum:Int 6 var current_count: Int 7 8 init(types: [String], values: [Double]) { 9 self.types = types 10 self.values = values 11 self.countnum = types.count 12 self.current_count = 0 13 } 14 15 16 17 func convert(value: Double) -> String { 18 19 if current_count == countnum{ 20 current_count = 0 21 } 22 let index = current_count 23 current_count += 1 24 25 let type = types[index] 26 if value < 3600 { 27 return "" 28 } 29 30 31 switch type { 32 case "blank": 33 return "" 34 default: 35 return "(type)\n(round((value/3600)*10)/10)h" 36 } 37 38 } 39 40 func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String { 41 42 return convert(value: value) 43 } 44}

投稿2018/10/12 05:01

Hayato1201

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xAxis

2018/10/12 05:16

番兵ですね。ベターなやり方だと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問