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

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

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

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

Q&A

解決済

2回答

3151閲覧

Anyで格納されている連想配列の値を判定してString型へ変換する関数を作りたい

Frepeer

総合スコア20

Swift

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

0グッド

0クリップ

投稿2019/09/30 12:50

前提・実現したいこと

引数の型を判定してString型へ変更する関数を作りたいです。

[Any]型の値が入った連想配列(Anyには文字列、数字、Date型の日付などが入ります)が複数あり、この値の正確な型を判定した上で、全ての値をStringにする為に関数を作りました。エラーとなってしまう為、良い方法がありましたら教えていただけますと幸いです。

発生している問題・エラーメッセージ

Argument labels '(_:)' do not match any available overloads

該当のソースコード

Swift

1//連想配列とキーが入った配列がありますーーーーーーーーーーーーーーーーーーーーーーーー 2 var cell01_data = [:] as [String: Any] 3 var cell01_key = [String] 4 var cell02_data = [:] as [String: Any] 5 var cell02_key = [String] 6 var cell03_data = [:] as [String: Any] 7 var cell03_key = [String] 8 9//このような関数を作りましたーーーーーーーーーーーーーーーーーーーーーーーー 10 func changeString(data:String)->String{ 11 return data 12 } 13 14 func changeString(data:Int)->String{ 15 return String(data as! Int) 16 } 17 18 func changeString(data:Date)->String{ 19 let f = DateFormatter() //日付フォーマット 20 f.dateFormat = "yyyy" 21 return f.string(from: data as! Date) 22 } 23 24//関数を呼び出します(TableViewのCellでの処理)ーーーーーーーーーーーーーーー 25  var text = changeString((self.cell01_data[cell01_key[indexPath.row]])) 26//ここでエラーになります 27  var text = changeString((self.cell02_data[cell02_key[indexPath.row]])) 28  var text = changeString((self.cell03_data[cell03_key[indexPath.row]]))

補足情報

Swift4.2 Xcode11

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

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

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

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

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

guest

回答2

0

ベストアンサー

辞書型に添え字でアクセスする場合の戻り値はオプショナルになるので、
cell01_data[...]の戻り値の型はAny?になると思います。

changeStringのオーバーロードは3つありますが、
Any?型を引数に取る関数がないので、「どのオーバーロードにも一致しません」とコンパイラがエラーを吐いています(この場合、Any?の中の型を調べて勝手に呼び出す関数を決めてくれたりはしません)。

おそらくですが、

swift

1func changeString(data:Any?)->String{ 2 // 型に応じて各関数に振り分ける 3}

こうした関数をもう一個実装してやれば、期待した動きになると思います。


追記:
サンプルコード作っておきました。

swift

1import UIKit 2 3let cell01_data: [String: Any] = [ 4 "Int": 12345, 5 "String": "Hogehoge", 6 "Date": Date(), 7] 8 9func changeString(data: String) -> String { 10 return data 11} 12 13func changeString(data: Int) -> String { 14 return String(data) 15} 16 17func changeString(data: Date) -> String { 18 let f = DateFormatter() //日付フォーマット 19 f.dateFormat = "yyyy" 20 return f.string(from: data) 21} 22 23func changeString(data: Any?) -> String { 24 switch data { 25 case let intValue as Int: 26 return changeString(data: intValue) 27 case let stringValue as String: 28 return changeString(data: stringValue) 29 case let dateValue as Date: 30 return changeString(data: dateValue) 31 default: 32 return "?" 33 } 34} 35 36print(changeString(data: cell01_data["Int"])) // 12345 37print(changeString(data: cell01_data["String"])) // Hogehoge 38print(changeString(data: cell01_data["Date"])) // 2019

他にも書き方はあると思いますが、参考になれば。

投稿2019/10/01 00:16

編集2019/10/01 06:16
takabosoft

総合スコア8356

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

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

Frepeer

2019/10/03 02:35

ご丁寧にエラーの解説をしていただきありがとうございます! Anyで受け取って再度関数を使うのですね、勉強になります。 頂いたコードでうまく出来ました。ありがとうございます。
guest

0

changeString(data:)をこうしちゃう。

swift

1private var formatter: DateFormatter = { 2 let f = DateFormatter() 3 f.dateFormat = "yyyy" 4 return f 5} () 6 7func changeString(data: Any?) -> String { 8 switch data { 9 case let str as String: return str 10 case let i as Int: return String(i) 11 case let d as Date: return formatter.string(from: d) 12 default: fatalError("Unknown Type") 13 } 14}

fatalErrorのところはそちらの仕様に合わせてね。

それと、呼び出しはchangeString(data: arg)ね。data:が抜けてる。

投稿2019/10/01 01:32

MasakiHori

総合スコア3384

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

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

Frepeer

2019/10/03 02:33

Anyで受け取った後に振り分けているのですね。 答えていただけるとハッとしますが、自分では気づきませんでした。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問