SwiftベースのアプリケーションはOS X 10.9 / iOS 7以下で動作しますか?


616

SwiftベースのアプリケーションはOS X 10.9(Mavericks)/ iOS 7以下で動作しますか?

たとえば、OS X 10.8(Mountain Lion)を実行しているマシンを使用していて、Swiftで記述したアプリケーションがそのマシンで実行されるかどうか疑問に思っています。

または、Mac OSを使用してSwiftアプリケーションを作成するにはどうすればよいですか?


51
Swiftが「通常の」実行可能ファイルにコンパイルされ、OSに必要なSwift固有のランタイムライブラリがないと仮定すると、古いシステムで実行できるはずです。まだわかりません。Xcode 6をダウンロードして試してください。
rmaddy 2014年

12
正式な回答は、一般教書ビデオに記載されています。
Steven Fisher

3
@rmaddy FWIW:WWDCでのSwiftプレゼンテーションでは、SwiftとObjective-Cのランタイムが同じであることが最も明確に述べられていました。
11684 2014年

1
それは公共の知識であり、それらのオペレーティングシステムで実行されるという基調講演でさえ言及されました。
rhummelmose 2014年

3
この質問は、ツアーページで例として使用されている質問です。
ドナルドダック

回答:


520

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
}

13
stackoverflow.com/questions/24007050/…を参照してください-これはこの回答と競合します(少なくとも「またはさらに低い」部分)。
rmaddy

14
私はiOS 7.0とOS X 10.9のみをテストしました。答えで述べたように。
Leandros、2014年

@Leandros varキーワードを使用することによって、なぜこの行に「UIViewController」を2回入力する必要があるのですか「var controller:UIViewController = UIViewController()」?varはJavaScript / C#と同じではありませんか(違う場合、悲しいです)?これはキャストですが、オブジェクトタイプは等号の両側で同じですか?
Tien Do

3
@TienDo私はSwiftの経験はありませんが、最初UIViewControllerのコロンが変数の型を表し、2番目の=記号がコンストラクターを呼び出した後(変数を初期化する)と思います。
ComFreek 2014

2
iOSの場合:Xcode 6ベータ版には、iOS 6までの展開ターゲットがあります。同じことを示すいくつかの答えがあります。
ySiggen 2014年

197

SwiftコードはOS X 10.9およびiOS 7.0にデプロイできます。通常、古いOSバージョンでの起動時にクラッシュします。


4
グレッグ、ここに来て質問に答えてくれてありがとう。Swiftから生成されたコードを実行できるようにする10.8-> 10.9および6.x-> 7.0の変更点について少し教えてください。
IvanVučica2014年

20
SwiftはObjective-Cメタデータにいくつかのビットを設定して、Swiftクラスをマークします。OS X 10.9およびiOS 7.0のlibobjcは、Swiftの到着に備えてこれらのビットを無視するように変更されました。古いOSバージョンはこれらのビットによって混乱します。
グレッグパーカー

9
私は思いMUCH Appleがあまりにも(少なくともOSX以降10.7から)古いプラットフォーム上スウィフトアプリの作業を行うことを検討するかどう感謝しています。その理由は、このOSを使用しているお客様がまだ多くいるため、10.9がサポートされる最小のOSである場合、Swiftで何年も開発を開始できないためです。
Mike Lischke 2014年

2
@GregParkerランタイム要件が変更されたかどうかにかかわらず、Swift 2のこの回答を更新できる可能性はありますか?
Andrey Tarantsov 2015年

1
Swiftで作成された実行可能ファイルでサポートされる最小の展開ターゲットは、iOS 7.0およびOSX 10.9のままです。iOS 7 / OSX 10.9以前で廃止されたAPIは使用できなくなります。ビルド時には、SwiftはXcodeで出荷されるSDKのみをサポートします。
フラッシュシェリダン

103

Appleは、SwiftアプリはiOS 7およびOS X Mavericksと下位互換性があると発表しました。WWDCアプリはSwiftで書かれています。


11
本当にWWDCはSwiftで書かれていますか?
Satheeshwaran 14年

7
はい、WWDCCアプリはSwiftで作成されています。彼らが昨日言ったように。
Shial

22
ジェイフリーマンはそうではないと主張している:twitter.com/saurik/status/473785847926374400
IvanVučica'14 / 06/18

2
Appleのマーケティング戦略は、企業がよく使用するものです。Windowsはアセンブリで作成されました!まあ、ブートローダーと他のいくつかだけですが、それアセンブリ書かれました。
コールジョンソン

4
@IvanVučicaですが、互換性の質問に回答するには4つのクラスで十分です。
ilya n。

100

アップデート-Xcode 6 Beta 4による

iOS 7およびOS X 10.9の最小導入ターゲット

SwiftコンパイラーとXcodeは、iOS 7またはOS X Mavericksの最小展開ターゲットを強制するようになりました。以前のデプロイメントターゲットを設定すると、ビルドが失敗します。

Xcode 6リリースノートから

したがって、私の前の回答(以下に表示)は、今後の開発には適用されません。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以下では利用できなくなります



以前のシステムアップデートと同じように、一部のフレームワーク/クラスは廃止されており、条件付きでサポートする必要があります。
ミリアムH.

@TienDoセミコロンは必要ありません:)誤って(その伝統に従って)入れても問題になりません
Anil Varghese

3
ただし、本当に必要な場合でも、セミコロンを使用できます。1行の2つのステートメントはセミコロンで区切られます
PaulWoodIII

33

簡単に言えば:

Swiftベースのアプリケーションは、同じアプリでOS X MavericksまたはiOS 7をターゲットに戻すことができます。

どのように可能ですか?

Xcode は、アプリのバンドル内に小さなSwiftランタイムライブラリを埋め込みます。ライブラリが埋め込まれているため、アプリは過去、現在、および将来のOSリリースで実行されるSwiftの一貫したバージョンを使用します。

なぜ私はこの答えを信頼すべきですか?

私がこの答えを言っているのは、1人のアップルガイがツイッターで教えてくれたか、hello worldを書いてテストしたからです。

アップル開発者ブログから撮りました。

これを信頼してください。


2
「小さい」には、20 MB程度が必要です。:)
BangOperator 2017年

1
ランタイム全体をバイナリに含めると少し肥大化しているように見えるかもしれませんが、Swiftはまだ完全に安定していないため、開発者がいくつかの共有ライブラリを更新するのではなく、自分の時間で新しいバージョンのSwiftで再コンパイルできるようにするのは理にかなっていますみんなのアプリを壊す。Swiftが安定したら、ランタイムは他のすべてと一緒に、どこかのdylibに保存されると思います。
ウィリアムTフログガード2017年

@WilliamTFroggard -うんそう願って
Durai Amuthan.H

30

SwiftはObjective-Cと同じランタイムを使用し、同じアプリケーションでObjective-Cを並べて実行することもできます(WWDC 2014の基調講演のとおり)。

これは、最終的な答えを見つけるために、Xcode 6と新しいSDKを使用してチェック/検証する必要があります。


1
Xcode Beta 6を使用すると10.9.3でSwiftアプリを実行できるように見えますが、Swiftアプリがどれだけ前に実行できるかわかりません(例10.7または10.8)。
John

22

「いいえ、SwiftはiOS 7よりも前では動作しません。しかし、私はYESと言いました。6.0のデプロイメントターゲットを使用してXcode 5で実行するSwiftプロジェクトを作成しました。

  • Xcode 6ベータ版で、Swiftプログラミング言語を選択してデモプロジェクトを作成するだけです。
  • Xcode 6ベータ版を閉じ、このデモプロジェクトをXcode 5で展開ターゲット6.0で開きます
  • また、シミュレータ6.1を選択します。

その後、そのプロジェクトはシミュレータ6.1でうまく実行されます。私のMacOS Xは10.9.3なので、「はい」と言った。これは10.9.3 Mac OS Xを搭載したiOS 7より前のバージョンで動作します。

ここにシミュレータのスクリーンショットがあります:

ここに画像の説明を入力してください

こちらもデモです


3
質問:迅速なサポートなしでは、XCode-5はどのように迅速なソースを構築しますか?
Subin Sebastian 2014

シミュレーターのスクリーンショットを見ることができます:)上記の添付のスクリーンショットをフォトショップで作成しませんでした
Nitin Gohel

つまり、目的のCアプリをSwiftに変換し、iOS 6に顧客がいるということです。それで、迅速なアプリは機能しますか?
Maneesh Sharma

それが機能する場合、最初にデモコードを試してみて、その後、definatyが機能することを確認します
Nitin Gohel

20

コードはそれを確認していますが、SwiftはWWDC 2014でのテクニカルキーノート(プラットフォームの状態、セッション102、34分00秒前後)でiOS 7とMavericksに互換性があるとApple自身は述べています


15

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で実行しました


1
さまざまな展開ターゲットはまだ正しくないと思います(XCode 6はベータ版です)。値を選択できるからといって、機能するわけではありません。OSX 10.7をターゲットとして試しましたが、うまくいきませんでした。また、プラットフォームに関する正式な確認は、上記のGreg Parkerによって行われていることにも注意してください。
Mike Lischke 2014年

@Mike Lischkeにも、私の主張を裏付けるいくつかのテストがありました。また、Deployment Target 10.7を選択すると、OS Xアプリを実行できます。しかし、OS Xアプリのサポートのスレッドを紹介していただきありがとうございます。
vladof81 2014年

それでは、私の結果をどのように説明しますか?そして、グレッグ・パーカーが書いたものはどうですか?Swift Appsが10.7で動作するようになれば幸いですが、これまでのところ、実際に動作する例はありません。もちろん、10.7も展開ターゲットとして設定できますが、違いはありません。アプリは狂います。
Mike Lischke 2014年

@Mike Lischke、デバイスでiOSアプリをテストしましたか?
vladof81 14年

1
私もそれを見て、Xcode 6ベータ版ですべての展開ターゲットをテストしました(回答と同じ)。2つの異なるテストアプリを使用して問題なく動作しました。
ySiggen 2014年

14

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を多用する他のアプリケーションは問題なく動作します。


14

これは、Apple Swiftブログから読んだ投稿です。役立つかもしれません。

アプリの互換性

Swiftアプリを作成すれば、アプリが今後もうまく機能することを確信できます。実際、同じアプリでOS X MavericksまたはiOS 7にターゲットを戻すことができます。これは、Xcodeがアプリのバンドル内に小さなSwiftランタイムライブラリを埋め込んでいるため可能です。ライブラリが埋め込まれているため、アプリは過去、現在、および将来のOSリリースで実行されるSwiftの一貫したバージョンを使用します。

バイナリ互換性とフレームワーク:

アプリのランタイム互換性は保証されますが、Swift言語自体は進化し続け、バイナリインターフェースも変更されます。安全のために、アプリのすべてのコンポーネントは、同じバージョンのXcodeとSwiftコンパイラーでビルドして、それらが確実に連携するようにする必要があります。

つまり、フレームワークは慎重に管理する必要があります。たとえば、プロジェクトがフレームワークを使用して埋め込み拡張機能とコードを共有する場合、フレームワーク、アプリ、拡張機能を一緒に構築する必要があります。特にサードパーティのSwiftを使用するバイナリフレームワークに依存するのは危険です。Swiftが変更されると、それらのフレームワークはアプリの他の部分と互換性がなくなります。バイナリインターフェイスが1〜2年で安定すると、SwiftランタイムはホストOSの一部となり、この制限はなくなります。


12

私は、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の場合、アプリはこれらのエラーメッセージを表示せずに正常に実行されます。


12

ここには古い回答がたくさんあるようですので、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の一貫したバージョンを使用します。


11

また、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のデプロイメントターゲットを使用していました)


10

次のコードを試してください:

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
}

そして、nav.rootviewcontrollerの使い方は?
アラン

8

はい、実際、AppleはSwiftアプリがiOS 7およびOS X Mavericksと下位互換性があると発表しました。さらに、WWDCアプリはSwiftプログラミング言語で書かれています。


8

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で渡されないようにします


Swift FrameworkはでMach-O TypeなければなりませんがDynamic Library、iOS 7 Static Libraryのみが受け入れます。
DawnSong 2016

7

2015年2月15日から有効になるクイックアップデートでは、iOS 8より前SDKを使用して開発されたアプリをストアに提出することはできません。したがって、それを念頭に置いて、Swiftで作成されたアプリはOS X 10.9およびiOS 7.0にも展開できると多くの人々が提案しているので、この問題を心配しない方が良いでしょう。


ソースを提供してくれませんか?
Binus

1
Base SDKとDeployment Targetの間には違いがあります。iOS 9のベースSDK とiOS 7の展開ターゲットを用意して、iTunes Connectに送信できます。ソースを提供しなかったため、反対投票。
2017年

1
現在のアップルのドキュメントはまだiOSの4.3のサポートを言及:developer.apple.com/library/content/documentation/IDEs/...
・クール

1

回答済みのコードスニペットLeandrosが投稿したは少し古いようです。私はそれを修正し、Swift 5でコンパイルできるようにしました。

スウィフト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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.