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에서 실행될 수 있습니다.
테스트에 사용되는 간단한 스위프트 애플리케이션 :
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
콜론 뒤 의 첫 번째 변수가 변수 유형을 나타내고 =
기호가 생성자를 호출 한 후 두 번째 발생 이라고 가정합니다 (변수를 초기화합니다).
스위프트 코드는 OS X 10.9 및 iOS 7.0에 배포 할 수 있습니다. 이전 OS 버전에서 시작하면 일반적으로 충돌합니다.
애플은 스위프트 앱이 iOS 7 및 OS X Mavericks와 호환 될 것이라고 발표했다. WWDC 앱은 Swift로 작성되었습니다.
iOS 7 및 OS X 10.9 최소 배포 대상
Swift 컴파일러와 Xcode는 이제 iOS 7 또는 OS X Mavericks의 최소 배포 대상을 시행합니다. 이전 배포 대상을 설정하면 빌드가 실패합니다.
따라서 이전 답변 (아래 참조)은 더 이상 개발에 적용되지 않습니다. iOS6 이하에서는 더 이상 스위프트를 사용할 수 없습니다.
스위프트 응용 프로그램은 iOS 6에서 실행할 수 있습니다. 많은 사람들이 스위프트가 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")
}
}
프로그래밍 방식으로 버튼을 추가하는 간단한 응용 프로그램입니다. 내 응용 프로그램은 두 개의 파일을 포함 AppDelegate.swift
하고 ViewController.swift
.
따라서 iOS 8 SDK 또는 일부 Swift 특정 API의 일부로 추가 된 새로운 API를 사용하지 않으면 (대응 API를 Objective-C에 사용할 수 없음) 응용 프로그램이 iOS 6 이상 (테스트 및 작동)에서 원활하게 작동합니다. iOS 5 (테스트되지 않음) Swift의 대부분의 API는 기존 Objective-C API를 대체하는 것입니다. 실제로 그들은 이진에서 동일합니다.
참고 : 신속한 응용 프로그램 배포 대상 Xcode 6 베타 4에 따르면 iOS 7 또는 OS X 10.9 (위의 업데이트 참조) 여야합니다. 따라서 iOS6 이하에서는 더 이상 swift를 사용할 수 없습니다.
Swift 기반 애플리케이션은 동일한 앱을 사용 하여 OS X Mavericks 또는 iOS 7 을 대상으로 다시 지정할 수 있습니다.
Xcode는 앱 번들 내에 작은 Swift 런타임 라이브러리를 포함합니다 . 라이브러리가 내장되어 있기 때문에 앱은 과거, 현재 및 향후 OS 릴리스에서 실행되는 일관된 Swift 버전을 사용합니다.
한 애플 녀석이 트위터에서 나에게 말했거나 안녕하세요 세계를 작성하고 테스트했을 때이 대답을 말하지 않기 때문입니다.
애플 개발자 블로그 에서 가져 왔습니다 .
믿을 수 있습니다.
Swift는 Objective-C 와 동일한 런타임을 사용하며 WWDC 2014 기조에 따라 동일한 응용 프로그램에서 나란히 Objective-C를 사용할 수도 있습니다.
최종 답변을 찾으려면 Xcode 6 및 새로운 SDK를 사용하여 확인 / 확인해야합니다 .
아니오, Swift는 iOS 7 이하에서 작동하지 않습니다. 그러나 YES 라고 말했습니다 . 6.0 배포 대상으로 Xcode 5에서 실행되는 Swift 프로젝트를 방금 만들었습니다.
그런 다음 해당 프로젝트는 시뮬레이터 6.1 에서 잘 실행됩니다 . 내 MacOS X는 10.9.3 이므로 iOS 7 보다 10.9.3 Mac OS X 보다 낮습니다 .
다음은 시뮬레이터의 스크린 샷입니다.
스위프트 응용 프로그램은 베타 4 릴리스 정보에 명시된대로 iOS 7 이상 에서 지원됩니다 . Xcode 6 베타의 iOS 6.0, 6.1, 7.0, 7.1, 8.0
스위프트 응용 프로그램은 OS X 10.9 이상 플랫폼에서 지원됩니다 . 배포 대상의 OS X 10.4 ~ 10.10 10.5에서 10.10을 타겟팅하고 10.9.3에서 실행하는 테스트를 거쳤습니다.
Swift 응용 프로그램 이 OS X 10.7 에서 실행 되지 않는 것 같습니다 . Mavericks에서 잘 실행되는 간단한 GUI 응용 프로그램 (보기, lable, 버튼)을 만들었습니다. 기본 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 개발자 빠른 블로그 : Swift Any로서의 Objective-C id
2014 년 7 월 11 일
적합성
WWDC에서들은 가장 일반적인 질문 중 하나는“Swift의 호환성 이야기는 무엇입니까?”였습니다. 이것은 훌륭한 첫 번째 주제처럼 보입니다.
앱 호환성 간단히 말해, iOS 8 및 OS X Yosemite가 출시 될 때 오늘 Swift 앱을 작성하여 올 가을에 App Store에 제출하면 앱이 미래에도 잘 작동 할 것이라고 믿을 수 있습니다. 실제로 동일한 앱을 사용하여 OS X Mavericks 또는 iOS 7을 다시 대상으로 지정할 수 있습니다. Xcode는 작은 Swift 런타임 라이브러리를 앱 번들 내에 포함하기 때문에 가능합니다. 라이브러리가 내장되어 있기 때문에 앱은 과거, 현재 및 향후 OS 릴리스에서 실행되는 일관된 Swift 버전을 사용합니다.
나는 또한 10.8 (단 하나의 버튼, 레이블에 텍스트를 설정)에서 매우 간단한 응용 프로그램을 시도했습니다. 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
Only를 허용 합니다.
빠른 업데이트는 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
}