แอปพลิเคชันที่ใช้ Swift จะทำงานกับOS X 10.9 (Mavericks) / iOS 7 หรือต่ำกว่าหรือไม่
ตัวอย่างเช่นฉันมีเครื่องที่ใช้OS X 10.8 (Mountain Lion) และฉันสงสัยว่าแอปพลิเคชันที่ฉันเขียนใน Swift จะทำงานหรือไม่
หรือฉันต้องสร้างแอปพลิเคชั่น Swift โดยใช้ Mac OS?
แอปพลิเคชันที่ใช้ Swift จะทำงานกับOS X 10.9 (Mavericks) / iOS 7 หรือต่ำกว่าหรือไม่
ตัวอย่างเช่นฉันมีเครื่องที่ใช้OS X 10.8 (Mountain Lion) และฉันสงสัยว่าแอปพลิเคชันที่ฉันเขียนใน Swift จะทำงานหรือไม่
หรือฉันต้องสร้างแอปพลิเคชั่น Swift โดยใช้ Mac OS?
คำตอบ:
ฉันเพิ่งทดสอบให้คุณแอพพลิเคชั่น Swift รวบรวมเป็นไบนารีมาตรฐานและสามารถทำงานบน OS X 10.9 และ iOS 7
แอปพลิเคชัน Simple 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หลังจากที่เครื่องหมายโคลอนแสดงถึงชนิดของตัวแปรและการเกิดขึ้นครั้งที่สองหลังจากที่=เครื่องหมายเรียกตัวสร้าง (เริ่มต้นตัวแปร)
สามารถปรับใช้รหัส Swift กับ OS X 10.9 และ iOS 7.0 มันมักจะผิดพลาดเมื่อเปิดตัวในเวอร์ชั่นระบบปฏิบัติการรุ่นเก่า
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+ จากประสบการณ์ของฉันมันไม่ใช่
ฉันได้ทดสอบแอปพลิเคชันแบบง่ายที่เขียนอย่างสมบูรณ์ใน Swift ในอุปกรณ์ iOS 6 มันทำงานได้ดีอย่างสมบูรณ์แบบ ดังที่ 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.swiftViewController.swift
ดังนั้นหากคุณไม่ได้ใช้ API ใหม่ใด ๆ ที่เพิ่มเข้ามาเป็นส่วนหนึ่งของ iOS 8 SDK หรือบาง API เฉพาะของ Swift (API ที่สอดคล้องกันไม่พร้อมใช้งานสำหรับ Objective-C) แอปพลิเคชันของคุณจะทำงานได้อย่างราบรื่นบน iOS 6 หรือใหม่กว่า บน iOS 5 (ไม่ผ่านการทดสอบ) APIs ส่วนใหญ่ใน Swift เป็นเพียงการแทนที่ API ของ Objective-C ที่มีอยู่ ในความเป็นจริงพวกเขาเหมือนกันในไบนารี
หมายเหตุ: ตาม Xcode 6 beta 4 สำหรับเป้าหมายการปรับใช้แอปอย่างรวดเร็วควรเป็น iOS 7 หรือ OS X 10.9 (ดูการอัปเดตข้างต้น) ดังนั้น swift จะไม่สามารถใช้งานได้กับ iOS6 และด้านล่างอีกต่อไป
แอปพลิเคชันที่ใช้ Swift สามารถกำหนดเป้าหมายกลับไปที่OS X MavericksหรือiOS 7ด้วยแอพเดียวกัน
Xcode ฝังไลบรารีรันไทม์ Swift ขนาดเล็กไว้ในชุดของแอปของคุณ เนื่องจากมีการฝังไลบรารีไว้แอปของคุณจึงใช้ Swift เวอร์ชันที่สอดคล้องกันซึ่งรันบนระบบปฏิบัติการทั้งในอดีตปัจจุบันและอนาคต
เพราะฉันไม่ได้พูดคำตอบนี้ในขณะที่ผู้ชายแอปเปิ้ลคนหนึ่งบอกกับฉันในทวิตเตอร์หรือฉันเขียนสวัสดีโลกและทดสอบ
เราเอาไปจากแอปเปิ้ลบล็อกนักพัฒนา
เพื่อให้คุณสามารถเชื่อถือได้
Swift ใช้รันไทม์เดียวกันกับObjective-Cและสามารถใช้ Objective-C แบบคู่ขนานในแอพพลิเคชั่นเดียวกัน (ตามคำปราศรัยของ WWDC 2014)
นี้จะต้องมีการตรวจสอบ / ตรวจสอบโดยใช้Xcode 6 และ SDK ใหม่เพื่อหาคำตอบสุดท้าย
ฉันอ่านคำตอบทั้งหมดที่กล่าวว่า: ไม่ Swift ไม่ทำงานกับ iOS น้อยกว่า 7 แต่ฉันบอกว่าใช่ฉันเพิ่งสร้างโครงการ Swift ที่ทำงานใน Xcode 5 พร้อมเป้าหมายการปรับใช้ 6.0
จากนั้นโครงการที่ทำงานได้ดีในการจำลอง 6.1 ฉันMacOS X 10.9.3 เป็นดังนั้นฉันกล่าวว่าใช่ที่วิ่งในต่ำกว่าiOS 7 กับ 10.9.3 Mac OS X
นี่คือภาพหน้าจอของเครื่องจำลอง:

ในขณะที่ยืนยันรหัสว่าแอปเปิ้ลตัวเองได้กล่าวว่าสวิฟท์จะเข้ากันได้บน iOS 7 และ Mavericks ในประเด็นสำคัญทางเทคนิคของพวกเขา ( รัฐแพลตฟอร์มเซสชั่น 102, รอบ 34 นาทีเครื่องหมาย 00 วินาที) ที่WWDC 2014
แอปพลิเคชัน Swift ได้รับการสนับสนุนในiOS 7 ขึ้นไปตามที่ระบุในบันทึกย่อรุ่นเบต้า 4 iOS 6.0, 6.1, 7.0, 7.1, 8.0 ใน Xcode 6 Beta
แอปพลิเคชัน Swift ได้รับการสนับสนุนบนแพลตฟอร์มOS X 10.9 ขึ้นไป OS X 10.4 ถึง 10.10 ในเป้าหมายการปรับใช้ ฉันได้ทดสอบการกำหนดเป้าหมาย 10.5 ถึง 10.10 และทำงานบน 10.9.3
มันจะปรากฏขึ้นการใช้งานสวิฟท์ไม่ทำงานบนOS X 10.7 ฉันเพิ่งสร้างแอปพลิเคชั่น GUI อย่างง่าย (มุมมอง, a lable, ปุ่ม) ซึ่งทำงานได้ดีบน Mavericks 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
...
อย่างไรก็ตามข้อความนี้น่ารำคาญเนื่องจากมีไลบรารี CoreGraphics ใน VM นี้อย่างแน่นอน แอปพลิเคชั่นอื่น ๆ ที่ทำให้การใช้งาน CoreGraphics ใช้งานได้ดี
นี่คือโพสต์ที่ฉันอ่านจากบล็อก apple Swift อาจเป็นประโยชน์:
หากคุณเขียนแอพ Swift คุณสามารถมั่นใจได้ว่าแอปของคุณจะทำงานได้ดีในอนาคต ในความเป็นจริงคุณสามารถกำหนดเป้าหมายกลับเป็นOS X Mavericks หรือ iOS 7ด้วยแอพเดียวกันนั้น สิ่งนี้เป็นไปได้เนื่องจาก Xcode ฝังไลบรารีรันไทม์ Swift ขนาดเล็กไว้ในชุดของแอปของคุณ เนื่องจากมีการฝังไลบรารีไว้แอปของคุณจึงใช้ Swift เวอร์ชันที่สอดคล้องกันซึ่งรันบนระบบปฏิบัติการทั้งในอดีตปัจจุบันและอนาคต
ในขณะที่ความมั่นใจในการใช้งานร่วมกันได้ของแอพพลิเคชั่นของคุณภาษา Swift จะยังคงพัฒนาต่อไปและอินเทอร์เฟซแบบไบนารี่ก็จะเปลี่ยนไปเช่นกัน เพื่อความปลอดภัยส่วนประกอบทั้งหมดในแอปของคุณควรสร้างด้วย Xcode รุ่นเดียวกันและคอมไพเลอร์ Swift เพื่อให้แน่ใจว่าทำงานร่วมกันได้
ซึ่งหมายความว่ากรอบงานต้องได้รับการจัดการอย่างรอบคอบ ตัวอย่างเช่นหากโครงการของคุณใช้เฟรมเวิร์กเพื่อแบ่งปันรหัสกับส่วนขยายที่ฝังคุณจะต้องสร้างเฟรมเวิร์กแอปและส่วนขยายร่วมกัน มันจะเป็นอันตรายหากพึ่งพาเฟรมเวิร์กไบนารีที่ใช้ Swift โดยเฉพาะจากบุคคลที่สาม เมื่อเปลี่ยนแปลงอย่างรวดเร็วเฟรมเวิร์กเหล่านี้จะไม่สามารถใช้งานร่วมกับแอพที่เหลือของคุณ เมื่ออินเทอร์เฟซแบบไบนารีเสถียรในปีหรือสองปีรันไทม์ Swift จะกลายเป็นส่วนหนึ่งของโฮสต์ระบบปฏิบัติการและข้อ จำกัด นี้จะไม่มีอีกต่อไป
ฉันทดสอบการใช้งานแอพสวิฟท์ที่ใช้กระดูกเปล่าบนอุปกรณ์ iPod Touch (รุ่นที่ 3) มันจะปรากฏขึ้นปพลิเคชันสวิฟท์ที่ใช้ไม่ได้ทำงานกับ 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
บล็อก swift ของผู้พัฒนา Apple: Objective-C id เป็น Swift Any
11 ก.ค. 2014
ความเข้ากันได้
หนึ่งในคำถามที่พบบ่อยที่สุดที่เราได้ยินเกี่ยวกับ WWDC คือ“ เรื่องราวความเข้ากันได้ของ Swift คืออะไร” ดูเหมือนว่าจะเป็นหัวข้อแรกที่ยอดเยี่ยม
หากคุณเขียนแอพ Swift วันนี้และส่งไปที่ App Store ในฤดูใบไม้ร่วงนี้เมื่อวางจำหน่าย iOS 8 และ OS X Yosemite คุณสามารถมั่นใจได้ว่าแอปของคุณจะทำงานได้ดีในอนาคต ในความเป็นจริงคุณสามารถกำหนดเป้าหมายกลับเป็น OS X Mavericks หรือ iOS 7 ด้วยแอพเดียวกันนั้น สิ่งนี้เป็นไปได้เนื่องจาก Xcode ฝังไลบรารีรันไทม์ Swift ขนาดเล็กไว้ในชุดของแอปของคุณ เนื่องจากมีการฝังไลบรารีไว้แอปของคุณจึงใช้ 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)
ลองรหัสต่อไปนี้:
มันทำงานได้โดยไม่มีกระดานเรื่องราว:
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
}
ใช่อันที่จริงแล้ว Apple ได้ประกาศว่าแอป Swift จะสามารถใช้งานร่วมกับ iOS 7 และ OS X Mavericks ได้ นอกจากนี้แอพ WWDC ยังเขียนด้วยภาษาโปรแกรม Swift
เมื่อพูดถึง Swift Frameworks สำหรับวันนี้ด้วย Xcode เวอร์ชัน 6.1.1 (6A2008a) หากเฟรมเวิร์ก Swift ได้รับการกำหนดเป้าหมายเป็น iOS 7.1 คำเตือนรายงานตัวเชื่อมโยง
ld: warning: embedded dylibs/frameworks only run on iOS 8 or later.
และไม่สามารถส่งแอปพลิเคชันไปยัง AppStore ได้ ตรวจสอบปัญหานี้: ผ้าสำลีเพื่อป้องกันไลบรารีและกรอบงานแบบไดนามิกไม่ให้ผ่านกับ iOS 7
Mach-O Typeต้องเป็นDynamic LibraryiOS 7 Static Libraryเท่านั้น
ด่วนปรับปรุงมีผลตั้งแต่15 กุมภาพันธ์ 2015เราไม่สามารถส่งแอพพลิเคไปยังร้านค้าที่ได้รับการพัฒนาโดยใช้SDK ก่อนที่จะ iOS 8 ดังนั้นจึงควรระลึกไว้เสมอว่าดีกว่าที่จะไม่กังวลเกี่ยวกับปัญหานี้เนื่องจากมีหลายคนแนะนำว่าแอพที่ทำใน 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
}