コードのみでStoryboardを使わずにSwiftとUIKitを使ってSwiftコードを新規作成するやり方について解説いたしました。
最近になってSenceDelegate.swiftが新しくできて「swift コードのみ」などと検索してもヒットしなかったり、2024年12月に確認したとこらXcode16.0, Swift 6,0が出ていたりしたので、まとめました。
参考になれば幸いです。
XcodeとSwiftのバージョン
Xcode: Version 16.0
Swift: Version 6.0
完成図
こちらが今回作成したアプリになります。(1つのボタンを実装しただけのシンプルなアプリです)

アプリ実装
プロジェクトの立ち上げ
Xcodeを立ち上げ、Create a new Xcode projectを選択します。

プロジェクトの設定
Producut Nameを選択して好きなアプリネームを入力してNextを選択して保存するフォルダを選択します。
※InterfaceはStoryboad, Life CycleはUIKit App Delegateを選択します。
※Use Core Dataのチェックはどちらでも良いと思います。

Xcode16.0の場合下記のような設定項目のため,SwiftUIでなく下記画像のようにStroyboardと以下のデフォルトの設定をそのまま設定します。

SwiftUIの波が押し寄せてきてますね…
Main.storyboardの削除
ナビゲータエリアのMain.storyboard をプロジェクトから削除します。
(こちらはしなくても良いのですが、削除した方が私はわかりやすいため削除していますmm)

Main Interfaceの設定(Xcode: Version 12.4の場合)
※Xcode 16.0の場合こちらは不要です。
①ナビゲータエリアのアプリ名を選択(この場合上記画像の一番上のTest.APP)
②TARGETS / General / Deployment Info / Main Interfaceを空にします
(PROJECTとTARGETSとあるTARGETSを選択すると表示)

infoエリア設定
Info設定を実施するために下記アコーディオンメニューを展開して指定の項目を削除します。
①TARGETS / info/ Custom iOS Target Properties / Application Scene Manifest選択②Scene Configuration → Application SessionRole → Item 0(default Configuration)
③Storyboard Nameを削除(カーソルを当てると+と-ボタンが出るので-ボタン押下)

Could not find a storyboard named ‘Main’ in bundle のエラー対応
Xcode16の場合ビルドすると下記のようなエラーが表示されます。
Could not find a storyboard named 'Main' in bundle
こちらの対応として‘Main’という設定を削除します。
TARGETS/ Info / Custom iOS Target Properties/ Main storyboard file base nameにカーソルを当てると+と-ボタンが表示されるので-ボタンを押して削除する。

SceneDelegate.swift設定
ここからコードの設定になります。
まず、SceneDelegate.swiftにて初期表示でこうなっているfunc scene()を修正します。
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let _ = (scene as? UIWindowScene) else { return }
}
上記コードを下記コードのように修正します。
※あくまで一例で絶対にこれが正しいというわけではありません。
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
//UIwindwosのアンラップ
guard let windowScene = (scene as? UIWindowScene) else { return }
//アンラップしたものWindwoSceceをselfに設定
let window = UIWindow(windowScene: windowScene)
self.window = window
//ルートビューを選択
window.rootViewController = ViewController()
//「window」を最前線に表示する
window.makeKeyAndVisible()
}
ViewController.swift設定
最後に、ViewController.swiftのviewDidLoad内に下記コードを追加します。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
button.backgroundColor = .red
button.setTitle("Test", for: .normal)
view.addSubview(button)
}
}
シュミレータで確認
確認としてシュミレータで実行して見ると下記のような結果になりました。

最後に
至ってシンプルな設定かなと思いますが、たまにアップデートがあったりするので、できるだけ更新できればと思います。
何かビルドできない等あればぜひTwitterでメッセージをいただければ修正・対応いたします。
ではまた。
コメント