

プログラミング初心者です。

ただいまswift勉強のため下記のサイトのコードを参照に  
<https://youtachannel.com/swift-storyboard-size/>

「Storyboardをデバイスごとに分けるコード」を作っていたのですが  
オリジナルに色々と追加コードを入れていたらエラーコードが出てしまったので  
作業が中断してしまいました。

こちらのエラー外し方わかる方、お力添えしていただけたら幸いです。

念のためエラーが写っているスクリーンショット戻りましたのでこちらの画像も添付しておきます。

大変申し訳ございませんがご協力よろしくお願い致します。

エラーコード：Expected declaration（34行目）

[code]

    import UIKit
    
    @UIApplicationMain
    [![画像の説明をここに入力][1]][1]class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
        let storyboard: UIStoryboard = self.grabStoryboard()
        if let window = window {
        window.rootViewController = storyboard.instantiateInitialViewController()
        }
    
        self.window?.makeKeyAndVisible()
    
        return true
    }
    
    func grabStoryboard() -> UIStoryboard {
        _ = UIStoryboard()
        _ = UIScreen.mainScreen().bounds.size.height
    
        //iPhone6
        };else if height == 667 {
            storyboard = UIStoryboard(name: "6S", bundle: nil)
        //iPhone6 Plus
        }else if height == 736 {
            storyboard = UIStoryboard(name: "6SPlus", bundle: nil)
        //iPhone4s
        }else if height == 480 {
            storyboard = UIStoryboard(name: "4S", bundle: nil)
        //iPhone5・5s・5c
        }else if height == 568 {
            storyboard = UIStoryboard(name: "5S_5C", bundle: nil)
        //iPad
        }else if height == 1024 {
            storyboard = UIStoryboard(name: "iPad", bundle: nil)
        //iPad Pro
        }else if height == 1366 {
            storyboard = UIStoryboard(name: "iPad_Pro", bundle: nil)
    return storyboard
    }
    
    func applicationWillResignActive(application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }
    
    func applicationDidEnterBackground(application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }
    
    func applicationWillEnterForeground(application: UIApplication) {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    }
    
    func applicationDidBecomeActive(application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }
    
    func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }
    }
    
[/code]


CC BY-SA 3.0
2016-04-12T02:06:20.267
23931
2016-04-12T03:26:54.860
2016-04-12T02:08:01.747
76
15126
question
swift swift2
Storyboardをデバイスごとに分けるコードでの質問


悪い点を含んだコードをいろんな人に見てもらって叩いてもらうのもプログラミング言語の学習においては必要なことだと思うのですが、今提示されているコードは叩かれる場所が多すぎて、一度に頭に入れるにはネタが多すぎるように思います。実際のアプリに取り掛かられる前に、もう一度、Swift言語そのものの入門(これが日本語で良いリソースがなかなか見当たらないのですが…)をきちんと行われたほうが良いのではないかと思います。

また、各デバイスのピクセルサイズに合わせて細かくStoryboardを切り替える、と言うのは、Appleの推奨する解決方法ではありません。Appleが複数デバイスへの対応方法として推奨しているのは、Auto
LayoutとSize
Class(この場合のClassはオブジェクト指向プログラミング言語で言うところのclassではなく、単に「大雑把な分類」という意味)を併用する形ですので、(もう少し学習が進んでから)そちらの対応を覚えられた方が良いと思います。  
(日本でアプリを開発する場合、ピクセル単位でレイアウトの指定されたデザインが「要件」として降りてくる場合もあるので、いずれ「Storyboardをデバイスごとに分ける」必要が出るかもしれませんが、そんな特殊な状況に対応するのは、そんな仕事をするようになってからで良いでしょう。)

* * *

とこれだけでは「回答」とは言えないので一応あなたのコードの話に戻りましょう。

あなたのコードは「最初に間違ったコード修正をしてしまった」→「Xcodeの的確とは言えないsuggestionに従ったせいでますますおかしくなってしまった」状態ですね。ここまでひどくなると一つ一つの文法的な誤りを修正していく方が大変なので、  
**いったん元に戻してしまいましょう** 。  
(gitなどのソースコード管理システムの機能が未習得であれば、覚えた方が良いですね。こまめにコミットするくせが付いていれば。少し前の状態に戻すことが簡単にできます。)

リンク先に提示されている元コードの`func grabStoryboard()`内には、初心者には真似して欲しくない悪い書き方が混ざっているので、

[code]

    var storyboard = UIStoryboard() //<-使いもしないインスタンスを作っている
    
[/code]

それを修正したこの辺りから始めましょう。

[code]

        // Storyboardを分ける
        func grabStoryboard() -> UIStoryboard {
            let storyboard: UIStoryboard
            let height = UIScreen.mainScreen().bounds.size.height
    
            //iPhone6
            if height == 667 {
                storyboard = UIStoryboard(name: "6S", bundle: nil)
                //iPhone6 Plus
            } else if height == 736 {
                storyboard = UIStoryboard(name: "6SPlus", bundle: nil)
                //iPhone4s
            } else if height == 480 {
                storyboard = UIStoryboard(name: "4S", bundle: nil)
                //iPhone5・5s・5c
            } else {
                storyboard = UIStoryboard(name: "5S_5C", bundle: nil)
            }
            return storyboard
        }
    
[/code]

(Storyboardのnameはあなたのコードに合わせておきました。)  
参照元記事の次のフレーズ「ちなみに、iPadに対応させたい場合は以下のコードをelseより前に追加します。」には、「elseより前」とあるのですから、その追加をした後はこうならなくてはいけません。

[code]

        func grabStoryboard() -> UIStoryboard {
            let storyboard: UIStoryboard
            let height = UIScreen.mainScreen().bounds.size.height
    
            //iPhone6
            if height == 667 {
                storyboard = UIStoryboard(name: "6S", bundle: nil)
                //iPhone6 Plus
            } else if height == 736 {
                storyboard = UIStoryboard(name: "6SPlus", bundle: nil)
                //iPhone4s
            } else if height == 480 {
                storyboard = UIStoryboard(name: "4S", bundle: nil)
                //iPad
            } else if height == 1024 {
                storyboard = UIStoryboard(name: "iPad", bundle: nil)
                //iPhone5・5s・5c
            } else {
                storyboard = UIStoryboard(name: "5S_5C", bundle: nil)
            }
            return storyboard
        }
    
[/code]

"iPad_Pro"用のコードを付け足す部分はあなたへの宿題として残しておきます。

個々の誤りについては書きませんが、ご自身でどこにどんな文法的誤りがあったのか確かめながら修正していってください。(次に何かご質問を書かれる場合は、ここまでひどくなる前…意味もわからずにXcodeのsuggestionを受け入れてしまう前…の状態のコードを示された方が良いでしょう。)

* * *

繰り返しになりますが、この程度の文法的エラーがご自分で治せない状況なのでしたら、「Storyboardをデバイスごとに分けるコード」なんて特殊な状況に対応することを覚える前に、Auto
LayoutでのConstraintの使い方をみっちり学習する、方がはるかに有益だと思います。


CC BY-SA 3.0
2016-04-12T03:26:54.860
23935
2016-04-12T03:26:54.860
13972
23931
answer