14187


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

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

[code]

    // Book.swift
    
    class Book : RLMObject {
        dynamic var isbn = ""
        dynamic var name = ""
        dynamic var price = 0
        //サムネイルを追加したいから、imageURLを追加
        dynamic var imgURL = ""
    
        dynamic var publisher = Publisher()
    
        dynamic var owner: Publisher? {
            return linkingObjectsOfClass("Publisher", forProperty:"books").first as? Publisher
        }
    
        class func find(isbn:String) -> Book? {
            let result:Optional = Book.objectsWithPredicate(NSPredicate(format: "isbn = %@", isbn))
            if let books = result {
                return books.firstObject() as? Book
            }
            return nil
        }
    
        override class func primaryKey()->String{
            return "isbn"
        }
    }
    
[/code]

[code]

    // AppDelegate.swift
    
    import UIKit
    import Realm
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
    
        RLMRealm.setSchemaVersion(1, forRealmAtPath:RLMRealm.defaultRealmPath() , withMigrationBlock: { (migration,oldSchemaVersion) in
            if oldSchemaVersion < 1 {
                migration.enumerateObjects(Book.className()) { (oldObject, newObject) in
                    let book2 = newObject as! Book
                    let isbn = oldObject["isbn"] as! String // <--ここで、'AnyObject' is not convertible to 'String'とエラーが出てしまう 
                }
            }
        })
        return true
    }
    
[/code]

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

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


CC BY-SA 3.0
2015-08-08T06:46:08.050
13164
2015-08-09T04:21:29.250
2015-08-09T04:21:29.250
5519
10791
question
ios swift realm
Realm Objective-CをSwiftから使う際にマイグレーションのコードでコンパイルエラー


`oldObject`および`newObject`はともにOptionalタイプですので、アンラップが必要になります。

（何が起こっているかは下記のように、一度キャストを無くしてみるとわかります。）

[code]

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

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

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

[code]

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

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


CC BY-SA 3.0
2015-08-08T17:38:26.547
14187
2015-08-08T17:46:39.317
2015-08-08T17:46:39.317
5519
5519
13164
answer