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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

2301閲覧

ダウンキャストでエラーが生じてしまう

funkyfrea

総合スコア86

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

1クリップ

投稿2015/08/07 15:06

現在、realmの使い方を学んでいます。

そこで、http://qiita.com/jtemplej/items/10ed4bc0cc6519682e6e#notificationのコードを下記のように書き写して、マイグレーションを勉強しています。

Book.swift

lang

1 2class Book : RLMObject{ 3 dynamic var isbn = "" 4 dynamic var name = "" 5 dynamic var price=0 6 //サムネイルを追加したいから、imageURLを追加 7 dynamic var imgURL="" 8 9 dynamic var publisher=Publisher() 10 11 dynamic var owner:Publisher?{ 12 return linkingObjectsOfClass("Publisher", forProperty:"books" ).first as? Publisher 13 14 } 15 16 class func find(isbn:String) -> Book? { 17 let result:Optional = Book.objectsWithPredicate(NSPredicate(format: "isbn = %@", isbn)) 18 if let books = result { 19 return books.firstObject() as? Book 20 } 21 return nil 22 } 23 24 override class func primaryKey()->String{ 25 return "isbn" 26 } 27 28 29} 30 31 32

AppDelegate.swift

lang

1import UIKit 2import Realm 3 4@UIApplicationMain 5class AppDelegate: UIResponder, UIApplicationDelegate { 6 7 var window: UIWindow? 8 9 10 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 11 // Override point for customization after application launch. 12 13 14 RLMRealm.setSchemaVersion(1, forRealmAtPath:RLMRealm.defaultRealmPath() , withMigrationBlock: {migration,oldSchemaVersion in 15 if oldSchemaVersion < 1{ 16 migration.enumerateObjects(Book.className()){ oldObject,newObject in 17 18 let book2=newObject as! Book 19 let isbn = oldObject["isbn"] as! String<--ここで、'AnyObject' is not convertible to 'String'とエラーが出てしまう 20 21 } 22 23 } 24 25 26 }) 27 return true 28 } 29 30

上記のように、let isbn = oldObject["isbn"] as! Stringの部分で、'AnyObject' is not convertible to 'String'というエラーがでてしまう状態を解決できません。

どのようにすればよいのか教えてください。

よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2015/08/07 15:47

同じように書いてみましたが、私の環境ではエラーになりませんでした。使ってるXcodeのバージョンはいくつですか?
funkyfrea

2015/08/07 22:52

お返事ありがとうございます。 バージョンは6.3.2です。
guest

回答1

0

ベストアンサー

oldObjectおよびnewObjectはともにOptionalタイプですので、アンラップが必要になります。
(何が起こっているかは下記のように、一度キャストを無くしてみるとわかります。)

let isbn = oldObject["isbn"] // Cannot subscript a value of type 'RLMObject?' with an index of type 'String'

oldObjectはオプショナル(RLMObject?)なのでoldObject["isbn"]のように、そのままでは操作できません。oldObject?["isbn"]oldObject!["isbn"]などとしてアンラップする必要があります。

なので、該当の行を次のように修正すればビルドできます。

migration.enumerateObjects(Book.className()) { (oldObject, newObject) in let book2 = newObject as! Book let isbn = oldObject!["isbn"] // たとえば、強制アンラップする }

ちなみにSwiftを使う場合でiOS 8以降が対象なら、RealmSwiftというSwift専用のフレームワークのほうを使うと、APIがSwiftにより適した形になっているので、このようなOptionalの部分やキャストが必要な部分が無く、簡単に扱えるようになりますよ。

投稿2015/08/08 17:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

funkyfrea

2015/08/08 23:59

すみません、焦っていたので二つのサイトで質問してしまいました。 アンラップすることでエラーを解消できました。ありがとうございました!
退会済みユーザー

退会済みユーザー

2015/08/09 05:24

私はRealmの者なのですが、どちらかというとStackoverFlowのほうで質問していただけたほうがいいです。 また、前にも申し上げましたが、ユーザーグループや https://www.facebook.com/groups/realmjp/ チャットのサポートがありますので、 http://slack.realm.io/ 急いでいる場合などは、特にそちらで聞かれるほうが早く回答できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問