SwiftベースのアプリケーションはOS X 10.9(Mavericks)/ iOS 7以下で動作しますか?
たとえば、OS X 10.8(Mountain Lion)を実行しているマシンを使用していて、Swiftで記述したアプリケーションがそのマシンで実行されるかどうか疑問に思っています。
または、Mac OSを使用してSwiftアプリケーションを作成するにはどうすればよいですか?
SwiftベースのアプリケーションはOS X 10.9(Mavericks)/ iOS 7以下で動作しますか?
たとえば、OS X 10.8(Mountain Lion)を実行しているマシンを使用していて、Swiftで記述したアプリケーションがそのマシンで実行されるかどうか疑問に思っています。
または、Mac OSを使用してSwiftアプリケーションを作成するにはどうすればよいですか?
回答:
Swiftアプリケーションは標準バイナリにコンパイルされ、OS X 10.9およびiOS 7で実行できます。
テストに使用されるシンプルなSwiftアプリケーション:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
var controller = UIViewController()
var view = UIView(frame: CGRectMake(0, 0, 320, 568))
view.backgroundColor = UIColor.redColor()
controller.view = view
var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
label.center = CGPointMake(160, 284)
label.textAlignment = NSTextAlignment.Center
label.text = "I'am a test label"
controller.view.addSubview(label)
self.window!.rootViewController = controller
self.window!.makeKeyAndVisible()
return true
}
UIViewController
のコロンが変数の型を表し、2番目の=
記号がコンストラクターを呼び出した後(変数を初期化する)と思います。
SwiftコードはOS X 10.9およびiOS 7.0にデプロイできます。通常、古いOSバージョンでの起動時にクラッシュします。
Appleは、SwiftアプリはiOS 7およびOS X Mavericksと下位互換性があると発表しました。WWDCアプリはSwiftで書かれています。
iOS 7およびOS X 10.9の最小導入ターゲット
SwiftコンパイラーとXcodeは、iOS 7またはOS X Mavericksの最小展開ターゲットを強制するようになりました。以前のデプロイメントターゲットを設定すると、ビルドが失敗します。
したがって、私の前の回答(以下に表示)は、今後の開発には適用されません。SwiftはiOS6以下では利用できなくなります
SwiftアプリケーションはiOS 6で実行できます。多くの人がSwiftはiOS 7以降とOS X 10.9以降しかサポートしないと言っていますが、私の経験ではそうではありません。
iOS 6デバイスのSwiftで完全に記述された単純なアプリケーションをテストしました。それは完全にうまく働きます。Appleによると、SwiftコードはObjective-Cコードとバイナリ互換です。同じコンパイラとランタイムを使用してバイナリを作成します。
これが私がテストしたコードです:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton.buttonWithType(UIButtonType.System) as UIButton
button.frame = CGRectMake(100, 100, 100, 50)
button.backgroundColor = UIColor.greenColor()
button.setTitle("Test Button", forState: UIControlState.Normal)
button.addTarget(self, action: "buttonTapped:", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(button)
}
func buttonTapped(sender: UIButton!) {
println("buttonTapped")
}
}
これは単純なアプリケーションで、プログラムでボタンを追加するだけです。私のアプリケーションは2つだけのファイルが含まれ、AppDelegate.swift
そしてViewController.swift
。
そのため、iOS 8 SDKの一部として追加された新しいAPIまたは一部のSwift固有のAPI(対応するAPIはObjective-Cでは使用できません)を使用していない場合でも、アプリケーションはiOS 6以降でシームレスに動作します(テスト済みおよび動作中)。 iOS 5(テストされていません)。SwiftのほとんどのAPIは、既存のObjective-C APIの単なる置き換えです。実際、それらはバイナリで同じです。
注:迅速なアプリのXcode 6ベータ4に従って、展開ターゲットはiOS 7またはOS X 10.9である必要があります(上記の更新を参照)。そのため、SwiftはiOS6以下では利用できなくなります
Swiftベースのアプリケーションは、同じアプリでOS X MavericksまたはiOS 7をターゲットに戻すことができます。
Xcode は、アプリのバンドル内に小さなSwiftランタイムライブラリを埋め込みます。ライブラリが埋め込まれているため、アプリは過去、現在、および将来のOSリリースで実行されるSwiftの一貫したバージョンを使用します。
私がこの答えを言っているのは、1人のアップルガイがツイッターで教えてくれたか、hello worldを書いてテストしたからです。
アップル開発者ブログから撮りました。
これを信頼してください。
SwiftはObjective-Cと同じランタイムを使用し、同じアプリケーションでObjective-Cを並べて実行することもできます(WWDC 2014の基調講演のとおり)。
これは、最終的な答えを見つけるために、Xcode 6と新しいSDKを使用してチェック/検証する必要があります。
「いいえ、SwiftはiOS 7よりも前では動作しません。しかし、私はYESと言いました。6.0のデプロイメントターゲットを使用してXcode 5で実行するSwiftプロジェクトを作成しました。
その後、そのプロジェクトはシミュレータ6.1でうまく実行されます。私のMacOS Xは10.9.3なので、「はい」と言った。これは10.9.3 Mac OS Xを搭載したiOS 7より前のバージョンで動作します。
ここにシミュレータのスクリーンショットがあります:
Beta 4リリースノートに記載されているように、SwiftアプリケーションはiOS 7以降でサポートされています。Xcode 6ベータ版のiOS 6.0、6.1、7.0、7.1、8.0
Swiftアプリケーションは、OS X 10.9以降のプラットフォームでサポートされています。OS X 10.4 to 10.10 in Deployment Target。10.5から10.10をターゲットとしてテストし、10.9.3で実行しました
SwiftアプリケーションはOS X 10.7では動作しないようです。Mavericksで問題なく動作するシンプルなGUIアプリケーション(ビュー、ラベル、ボタン)を作成しました。基本SDKは10.9に設定され、展開ターゲットは10.7に設定されます。そのアプリケーションをDerivedDataフォルダーから10.7仮想マシンにコピーしましたが、起動時にクラッシュし、次のエラーが表示されます。
Crashed Thread: 0
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Application Specific Information:
dyld: launch, loading dependent libraries
Dyld Error Message:
Library not loaded: /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics
Referenced from: /Users/USER/Desktop/Swift-Test.app/Contents/MacOS/../Frameworks/libswiftAppKit.dylib
Reason: image not found
Binary Images:
0x109c65000 - 0x109c6afff +private.Swift-Test (1.0 - 1) <649695D0-58FD-3D02-9176-2D40D4E711F2> /Users/USER/Desktop/Swift-Test.app/Contents/MacOS/Swift-Test
0x109c83000 - 0x109dbffff +libswift_stdlib_core.dylib (1.0 - 600.0.34.4.5) <10AAC369-9404-321D-A892-49F65856D7AF> /Users/USER/Desktop/Swift-Test.app/Contents/Frameworks/libswift_stdlib_core.dylib
...
ただし、このVMには確かにCoreGraphicsライブラリがあるため、このメッセージは苛立たしいものです。CoreGraphicsを多用する他のアプリケーションは問題なく動作します。
これは、Apple Swiftブログから読んだ投稿です。役立つかもしれません。
Swiftアプリを作成すれば、アプリが今後もうまく機能することを確信できます。実際、同じアプリでOS X MavericksまたはiOS 7にターゲットを戻すことができます。これは、Xcodeがアプリのバンドル内に小さなSwiftランタイムライブラリを埋め込んでいるため可能です。ライブラリが埋め込まれているため、アプリは過去、現在、および将来のOSリリースで実行されるSwiftの一貫したバージョンを使用します。
アプリのランタイム互換性は保証されますが、Swift言語自体は進化し続け、バイナリインターフェースも変更されます。安全のために、アプリのすべてのコンポーネントは、同じバージョンのXcodeとSwiftコンパイラーでビルドして、それらが確実に連携するようにする必要があります。
つまり、フレームワークは慎重に管理する必要があります。たとえば、プロジェクトがフレームワークを使用して埋め込み拡張機能とコードを共有する場合、フレームワーク、アプリ、拡張機能を一緒に構築する必要があります。特にサードパーティのSwiftを使用するバイナリフレームワークに依存するのは危険です。Swiftが変更されると、それらのフレームワークはアプリの他の部分と互換性がなくなります。バイナリインターフェイスが1〜2年で安定すると、SwiftランタイムはホストOSの一部となり、この制限はなくなります。
私は、iPod Touch(第3世代)デバイスで必要最小限のSwiftベースのアプリを実行することをテストしました。Swiftベースのアプリは iOS 5.x では動作しないようですが、動作しますのiOS 6.xで仕事を
iOS 5.0.1でテストアプリを起動しようとしたときにデバッグログに表示される内容は次のとおりです。
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftCoreGraphics.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftDarwin.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftDispatch.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftFoundation.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftObjectiveC.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftUIKit.dylib with errno=1
dyld: Symbol not found: _OBJC_CLASS_$_NSObject
Referenced from: /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib
Expected in: /usr/lib/libobjc.A.dylib
in /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib
iOS 6.1.6の場合、アプリはこれらのエラーメッセージを表示せずに正常に実行されます。
ここには古い回答がたくさんあるようですので、Swiftチームからの公式の回答を投稿したいと思います。SwiftはOS X MavericksおよびiOS 7と下位互換性があります
Apple開発者向けの迅速なブログ:Objective-C id as Swift Any
2014年7月11日
互換性
WWDCで最もよく聞かれた質問の1つは、「Swiftの互換性について教えてください」です。これは素晴らしい最初のトピックのようです。
アプリの互換性簡単に言うと、iOS 8とOS X Yosemiteがリリースされた今秋にSwiftアプリを作成して、App Storeに提出すると、アプリが将来うまく機能することを確信できます。実際、同じアプリでOS X MavericksまたはiOS 7にターゲットを戻すことができます。これは、Xcodeがアプリのバンドル内に小さなSwiftランタイムライブラリを埋め込んでいるため可能です。ライブラリが埋め込まれているため、アプリは過去、現在、および将来のOSリリースで実行されるSwiftの一貫したバージョンを使用します。
また、10.8の非常にシンプルなアプリも試してみました(1つのボタンでラベルにテキストを設定します)。Greg Parkerが述べたように、起動時にクラッシュしました:
Dyld Error Message:
Symbol not found: __dispatch_source_type_memorypressure
Referenced from: /Volumes/*/SwifTest.app/Contents/MacOS/../Frameworks/libswiftDispatch.dylib
Expected in: /usr/lib/libSystem.B.dylib
in /Volumes/*/SwifTest.app/Contents/MacOS/../Frameworks/libswiftDispatch.dylib
(これは10.7のデプロイメントターゲットを使用していました)
次のコードを試してください:
StoryBoardがなくても機能します。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window!.backgroundColor = UIColor.whiteColor()
// Create a nav/vc pair using the custom ViewController class
let nav = UINavigationController()
let vc = ViewController(nibName: "ViewController", bundle: nil)
// Push the vc onto the nav
nav.pushViewController(vc, animated: false)
// Set the window’s root view controller
self.window!.rootViewController = nav
// Present the window
self.window!.makeKeyAndVisible()
return true
}
Swift Frameworksに関しては。今日のように、Xcodeバージョン6.1.1(6A2008a)では、SwiftフレームワークがiOS 7.1をターゲットにしている場合、リンカーは警告を報告します
ld: warning: embedded dylibs/frameworks only run on iOS 8 or later.
また、アプリケーションをAppStoreに送信することはできません。この問題を確認してください:Lintは、動的ライブラリーとフレームワークがiOS 7で渡されないようにします
Mach-O Type
なければなりませんがDynamic Library
、iOS 7 Static Library
のみが受け入れます。
2015年2月15日から有効になるクイックアップデートでは、iOS 8より前のSDKを使用して開発されたアプリをストアに提出することはできません。したがって、それを念頭に置いて、Swiftで作成されたアプリはOS X 10.9およびiOS 7.0にも展開できると多くの人々が提案しているので、この問題を心配しない方が良いでしょう。
回答済みのコードスニペットLeandrosが投稿したは少し古いようです。私はそれを修正し、Swift 5でコンパイルできるようにしました。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
let controller = UIViewController()
let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 568))
view.backgroundColor = UIColor.red
controller.view = view
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
label.center = CGPoint(x: 160, y: 284)
label.textAlignment = NSTextAlignment.center
label.text = "I'am a test label"
controller.view.addSubview(label)
self.window!.rootViewController = controller
self.window!.makeKeyAndVisible()
return true
}