app swift 开发mac
2015-03-10 15:36:44 weixin_33816821 阅读数 8

Swift90Days - 用 Swift 开发 Mac App 1 / 3

今天抽点时间找了篇 Raywenderlich 上的教程入门了一下 Mac App 的开发。

教程的例子是实现一个简单的 TableView ,不过在 Mac 里它叫做 NSTableView

用法也和 UITableView 相似,通过 delegatedatasource 来加载列表:

import Cocoa

class MasterViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {

    var bugs: [ScaryBugDoc]!

    override func viewDidLoad() {
        super.viewDidLoad()

        // init bugs
        var doc1 = ScaryBugDoc(title: "Potato Bug", rating: 4, thumbImage:NSImage(named:"potatoBugThumb")!, fullImage: NSImage(named:"potatoBug")!)
        var doc2 = ScaryBugDoc(title: "House Centipede", rating: 4, thumbImage:NSImage(named:"centipedeThumb")!, fullImage: NSImage(named:"centipede")!)
        var doc3 = ScaryBugDoc(title: "Wolf Spider", rating: 4, thumbImage:NSImage(named:"wolfSpiderThumb")!, fullImage: NSImage(named:"wolfSpider")!)
        var doc4 = ScaryBugDoc(title: "Lady Bug", rating: 4, thumbImage:NSImage(named:"ladybugThumb")!, fullImage: NSImage(named:"ladybug")!)
        bugs = [doc1,doc2,doc3,doc4]
    }



    // MARK: NSTableViewDataSource
    func tableView(tableView: NSTableView!, viewForTableColumn tableColumn: NSTableColumn!, row: Int) -> NSView! {
        var cellView = tableView.makeViewWithIdentifier(tableColumn.identifier, owner: self) as NSTableCellView
        if cellView.identifier == "BugColumn" {
            var doc = bugs[row]
            cellView.imageView?.image = doc.thumbImage
            cellView.textField?.stringValue = doc.data.title
        }
        return cellView;
    }

    func numberOfRowsInTableView(tableView: NSTableView) -> Int {
        return bugs.count
    }

}

好吧就这么点了,感兴趣的同学可以看下文末的教程链接。


原文链接:

2015-11-30 10:24:00 weixin_30363817 阅读数 7
        iOS8推出一个新特性,叫做Handoff。Handoff中文含义为换手(把接力棒传给下一个人),可以在一台Mac和iOS设备上开始工作,中途将工作交换到另一个Mac或iOS设备中进行。这个在iOS8和Yosemite得到支持,当然在iOS9和EI Captain中也有这个功能。

     Handoff中使用了一个“活动”的概念,它可以在多台设备间传递用户的“活动”。当用户从一台设备切换到另一台设备后,用户完全可以不中断原有的“活动”,也不需要重新配置应用程序。在这个过程中,Handoff将自动在iOS设备和Mac间保持应用程序的同步。

       本应用实现了在两台iOS设备之间的协同工作。当在一台iOS设备上运行该应用时,打开另一台安装该应用的iPhone,可以快速看到同样的显示内容。可以快速实现多台设备的同步,提高了工作效率。这里我将通过Swift来实现。项目我已经上传 https://github.com/chenyufeng1991/Handoff  。

(1)创建一个iOS项目,首先在Info.plist文件中加入一个字段,NSUserActivityTypes,值可以任意,但是要唯一,我这里是:com.chenyufengweb.HandoffDemo.sync。到时候我会在代码中用到。

(2)在AppDelegate.swift中实现一个方法如下:

 

  1. func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {  
  2.   print("AppDelegate -- continueUserActivity")  
  3.   let topViewController = self.window?.rootViewController as! AnyObject  
  4.   restorationHandler([topViewController])  
  5.     
  6.   return true  
  7. }  

(3)在ViewController.swift中实现如下:

 

 

  1. import UIKit  
  2.   
  3. class ViewController: UIViewController,NSUserActivityDelegate {  
  4.     
  5.   @IBOutlet weak var textField: UITextField!  
  6.   @IBOutlet weak var switchButton: UISwitch!  
  7.     
  8.   var str:String!  
  9.   var isOn:String!  
  10.     
  11.   override func viewDidLoad() {  
  12.     super.viewDidLoad()  
  13.       
  14.     let myActivity:NSUserActivity! = NSUserActivity(activityType: "com.chenyufengweb.HandoffDemo.sync")  
  15.       
  16.     str = textField.text  
  17.     isOn = switchButton.on ? "on" : "off"  
  18.       
  19.     //定义一个字典;  
  20.     let items = ["text":str,"switch":isOn]  
  21.       
  22.     //配置活动参数;  
  23.     myActivity.userInfo = items  
  24.     myActivity.title = "sync"  
  25.     myActivity.becomeCurrent()  
  26.     myActivity.delegate = self  
  27.     myActivity.needsSave = true  
  28.       
  29.     self.userActivity = myActivity  
  30.       
  31.     //以代码的方式进行消息响应;  
  32.     //    self.textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.ValueChanged)  
  33.     //    self.switchButton.addTarget(self, action: "onChanged", forControlEvents: UIControlEvents.ValueChanged)  
  34.       
  35.   }  
  36.     
  37.   func textFieldDidChange() -> Void{  
  38.       
  39.     print("Text changed")  
  40.     self.userActivity?.becomeCurrent()  
  41.     self.userActivity?.needsSave = true  
  42.       
  43.   }  
  44.     
  45.   func onChanged() -> Void{  
  46.       
  47.     print("Switch changed")  
  48.     self.userActivity?.becomeCurrent()  
  49.     self.userActivity?.needsSave = true  
  50.       
  51.   }  
  52.     
  53.   //以segue的方式进行控件响应,个人比较喜欢;  
  54.   @IBAction func textFieldDidChange(sender: AnyObject) {  
  55.       
  56.     print("Text changed")  
  57.     self.userActivity?.becomeCurrent()  
  58.     self.userActivity?.needsSave = true  
  59.       
  60.   }  
  61.     
  62.     
  63.   @IBAction func onChanged(sender: AnyObject) {  
  64.       
  65.     print("Switch changed")  
  66.     self.userActivity?.becomeCurrent()  
  67.     self.userActivity?.needsSave = true  
  68.       
  69.   }  
  70.     
  71.     
  72.   //MARK: - Handoff  
  73.   /* 
  74.   注意:userActivityWillSave()方法和userActivityWasContinued()这两个方法在当前进行操作的设备A上执行; 
  75.    
  76.    
  77.   restoreUserActivityState()方法在打开另一个设备B上执行; 
  78.   */  
  79.     
  80.   //把当前的数据存储到字典中;  
  81.   func userActivityWillSave(userActivity: NSUserActivity) {  
  82.     print("ViewController userActivityWillSave")  
  83.       
  84.     str = textField.text  
  85.     isOn = switchButton.on ? "on" : "off"  
  86.       
  87.     let items = ["text" : str,"switch" : isOn]  
  88.     userActivity.addUserInfoEntriesFromDictionary(items)  
  89.       
  90.     print("userActivityWillSave:\(str),  \(isOn)")  
  91.       
  92.   }  
  93.     
  94.     
  95.     
  96.   func userActivityWasContinued(userActivity: NSUserActivity) {  
  97.     print("ViewController userActivityWasContinued")  
  98. //      
  99. //    let dictionary:NSDictionary = (userActivity.userInfo)!  
  100. //    let textForKey = dictionary.objectForKey("text") as! String  
  101. //    let switchForKey = dictionary.objectForKey("switch") as! String  
  102. //    print("text = \(textForKey),switch = \(switchForKey)")  
  103. //      
  104.   }  
  105.     
  106.     
  107.   //从字典中读出数据;  
  108.   override func restoreUserActivityState(activity: NSUserActivity) {  
  109.     print("ViewCOntroller restoreUserActivityState")  
  110.     let dictionary:NSDictionary = (activity.userInfo)!  
  111.     let textForKey = dictionary.objectForKey("text") as! String  
  112.     let switchForKey = dictionary.objectForKey("switch") as! String  
  113.     print("text = \(textForKey),switch = \(switchForKey)")  
  114.       
  115.     self.textField.text = textForKey  
  116.       
  117.     if (switchForKey == "on"){  
  118.         
  119.       self.switchButton.on = true  
  120.       print("ononononon")  
  121.         
  122.     }else{  
  123.         
  124.       self.switchButton.on = false  
  125.       print("offoffoffoffoff")  
  126.         
  127.     }  
  128.       
  129.   }  
  130.     
  131. }  

 

(4)运行效果如下:

 

 

 

 

github主页:https://github.com/chenyufeng1991  。欢迎大家访问!

 

转载于:https://www.cnblogs.com/Ice-snowPride/p/5006452.html

2015-11-10 22:07:18 CHENYUFENG1991 阅读数 4131
        iOS8推出一个新特性,叫做Handoff。Handoff中文含义为换手(把接力棒传给下一个人),可以在一台Mac和iOS设备上开始工作,中途将工作交换到另一个Mac或iOS设备中进行。这个在iOS8和Yosemite得到支持,当然在iOS9和EI Captain中也有这个功能。

     Handoff中使用了一个“活动”的概念,它可以在多台设备间传递用户的“活动”。当用户从一台设备切换到另一台设备后,用户完全可以不中断原有的“活动”,也不需要重新配置应用程序。在这个过程中,Handoff将自动在iOS设备和Mac间保持应用程序的同步。

       本应用实现了在两台iOS设备之间的协同工作。当在一台iOS设备上运行该应用时,打开另一台安装该应用的iPhone,可以快速看到同样的显示内容。可以快速实现多台设备的同步,提高了工作效率。这里我将通过Swift来实现。项目我已经上传 https://github.com/chenyufeng1991/Handoff  。

(1)创建一个iOS项目,首先在Info.plist文件中加入一个字段,NSUserActivityTypes,值可以任意,但是要唯一,我这里是:com.chenyufengweb.HandoffDemo.sync。到时候我会在代码中用到。

(2)在AppDelegate.swift中实现一个方法如下:

  func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
    print("AppDelegate -- continueUserActivity")
    let topViewController = self.window?.rootViewController as! AnyObject
    restorationHandler([topViewController])
    
    return true
  }

(3)在ViewController.swift中实现如下:

import UIKit

class ViewController: UIViewController,NSUserActivityDelegate {
  
  @IBOutlet weak var textField: UITextField!
  @IBOutlet weak var switchButton: UISwitch!
  
  var str:String!
  var isOn:String!
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    let myActivity:NSUserActivity! = NSUserActivity(activityType: "com.chenyufengweb.HandoffDemo.sync")
    
    str = textField.text
    isOn = switchButton.on ? "on" : "off"
    
    //定义一个字典;
    let items = ["text":str,"switch":isOn]
    
    //配置活动参数;
    myActivity.userInfo = items
    myActivity.title = "sync"
    myActivity.becomeCurrent()
    myActivity.delegate = self
    myActivity.needsSave = true
    
    self.userActivity = myActivity
    
    //以代码的方式进行消息响应;
    //    self.textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.ValueChanged)
    //    self.switchButton.addTarget(self, action: "onChanged", forControlEvents: UIControlEvents.ValueChanged)
    
  }
  
  func textFieldDidChange() -> Void{
    
    print("Text changed")
    self.userActivity?.becomeCurrent()
    self.userActivity?.needsSave = true
    
  }
  
  func onChanged() -> Void{
    
    print("Switch changed")
    self.userActivity?.becomeCurrent()
    self.userActivity?.needsSave = true
    
  }
  
  //以segue的方式进行控件响应,个人比较喜欢;
  @IBAction func textFieldDidChange(sender: AnyObject) {
    
    print("Text changed")
    self.userActivity?.becomeCurrent()
    self.userActivity?.needsSave = true
    
  }
  
  
  @IBAction func onChanged(sender: AnyObject) {
    
    print("Switch changed")
    self.userActivity?.becomeCurrent()
    self.userActivity?.needsSave = true
    
  }
  
  
  //MARK: - Handoff
  /*
  注意:userActivityWillSave()方法和userActivityWasContinued()这两个方法在当前进行操作的设备A上执行;
  
  
  restoreUserActivityState()方法在打开另一个设备B上执行;
  */
  
  //把当前的数据存储到字典中;
  func userActivityWillSave(userActivity: NSUserActivity) {
    print("ViewController userActivityWillSave")
    
    str = textField.text
    isOn = switchButton.on ? "on" : "off"
    
    let items = ["text" : str,"switch" : isOn]
    userActivity.addUserInfoEntriesFromDictionary(items)
    
    print("userActivityWillSave:\(str),  \(isOn)")
    
  }
  
  
  
  func userActivityWasContinued(userActivity: NSUserActivity) {
    print("ViewController userActivityWasContinued")
//    
//    let dictionary:NSDictionary = (userActivity.userInfo)!
//    let textForKey = dictionary.objectForKey("text") as! String
//    let switchForKey = dictionary.objectForKey("switch") as! String
//    print("text = \(textForKey),switch = \(switchForKey)")
//    
  }
  
  
  //从字典中读出数据;
  override func restoreUserActivityState(activity: NSUserActivity) {
    print("ViewCOntroller restoreUserActivityState")
    let dictionary:NSDictionary = (activity.userInfo)!
    let textForKey = dictionary.objectForKey("text") as! String
    let switchForKey = dictionary.objectForKey("switch") as! String
    print("text = \(textForKey),switch = \(switchForKey)")
    
    self.textField.text = textForKey
    
    if (switchForKey == "on"){
      
      self.switchButton.on = true
      print("ononononon")
      
    }else{
      
      self.switchButton.on = false
      print("offoffoffoffoff")
      
    }
    
  }
  
}

(4)运行效果如下:





github主页:https://github.com/chenyufeng1991  。欢迎大家访问!

2017-07-07 09:25:00 weixin_33712987 阅读数 8

音乐类app


教程地址

1. 布局

1709268-23d82eddc80e8727.png
screenshot.png

现在好多教程都是采用storyboard布局,作为新手入门的时候,固然很方便.但是我们看到别人的代码很多都是纯代码布局或者混合xib进行布局.在这篇文章中,我试着利用纯代码来完成整篇文章的布局,有错误的地方欢迎指正,也希望可以找到小伙伴一起学习swift

  • 编译工具: xcode 8
  • 编译环境: swift 3.1
  • 模拟器设备 ios 10.3 iphone6 (暂不考虑版本的适配问题)

按照教程提供的界面,可以得到以下信息:
(英文主要是一些控件名)

1. 需要的背景是一个Image View 尺寸与手机尺寸一致 坐标为(0,0)

        // 初始化Image View(background)
        imageVwbg = {
            var image = UIImageView()
            image = UIImageView(frame: self.view.frame)
            let bg = UIImage(named: "bg")
            image.image = bg
            return image  
        }()

2. 需要一个菜单按钮

        // 初始化菜单按钮
        btnMenu = {
            let btn = UIButton(frame: CGRect(x:339, y:34,width:self.view.bounds.size.width*33/375, height:self.view.bounds.size.height*21/667))
            let icon = UIImage(named:"menu")?.withRenderingMode(.alwaysOriginal)
            //设置图标
            btn.setImage(icon, for:.normal)
            return btn
        }()

3. 专辑的封面图 需要一个大小为145x145 坐标为(115,38)的Image View

        // 初始化Image View(封面外圆)
        imageVwfw = {
            let image = UIImageView(frame: CGRect(x:115, y:38,width:self.view.bounds.size.width*145/375, height:self.view.bounds.size.height*145/667))
            // 增加边框颜色
            let imageVwfwup = Toucan(image: UIImage(named: "thumb")!).maskWithEllipse(borderWidth: 6, borderColor: UIColor(red: 210/255, green: 210/255, blue: 210/255, alpha: 1.0)).image
            
            image.image = imageVwfwup
            
            return image
        }()

4. 中间显示播放时长的小圆 需要一个大小为45x45 坐标为(166,88)Image View 显示时间需要一个Label 格式居中 颜色为白色

        // 初始化Image View(封面内圆)
        imageVwfn = {
            let image = UIImageView(frame: CGRect(x:166, y:88,width:self.view.bounds.size.width*45/375, height:self.view.bounds.size.height*45/667))
            
            image.image = UIImage(named: "thumb_oval")
            
            return image
        }()
        ...
        // label音乐时长
        songDuration = {
            let label = UILabel(frame:CGRect(x:174, y:103, width:33, height:16))
            label.text = "00:00"
            label.textColor = .white
            label.font = UIFont.systemFont(ofSize: 10)
            return label
        }()
        

4. 控制条是1个UIView 加上5个button uiview的高度为47 坐标为(0,228) button平均分布

        // MARK: -  初始化控制条
        ctrlView = {
            let view = UIView(frame:CGRect(x:0, y:228, width:self.view.bounds.size.width, height:47))
            view.backgroundColor = UIColor(red: 156/255, green: 169/255, blue: 232/255, alpha: 0.3)

            return view
        }()
        // 控制条的按钮
        //循环播放按钮
        let btnLoop: UIButton = {
            let btn = UIButton(frame:CGRect(x:28, y:8, width:32, height:32))
            let onIcon = UIImage(named:"looponIcon")?.withRenderingMode(.alwaysOriginal)
            let offIcon = UIImage(named:"loopoffIcon")?.withRenderingMode(.alwaysOriginal)
            //设置图标
            btn.setImage(offIcon, for:.normal)
            btn.setImage(onIcon, for:.highlighted)
            return btn
        }()
        // 上一首按钮
        let btnPrev: UIButton = {
            let btn = UIButton(frame:CGRect(x:100, y:8, width:32, height:32))
            let icon = UIImage(named:"prevIcon")?.withRenderingMode(.alwaysOriginal)
            //设置图标
            btn.setImage(icon, for:.normal)
            return btn
        }()
        // 播放暂停按钮
        let btnPlayMode: UIButton = {
            let btn = UIButton(frame:CGRect(x:164, y:0, width:48, height:48))
            let onIcon = UIImage(named:"playIcon")?.withRenderingMode(.alwaysOriginal)
            let offIcon = UIImage(named:"pauseIcon")?.withRenderingMode(.alwaysOriginal)
            //设置图标
            btn.setImage(offIcon, for:.normal)
            btn.setImage(onIcon, for:.highlighted)
            return btn
        }()
        // 下一首按钮
        let btnNext: UIButton = {
            let btn = UIButton(frame:CGRect(x:244, y:8, width:32, height:32))
            let icon = UIImage(named:"nextIcon")?.withRenderingMode(.alwaysOriginal)
            //设置图标
            btn.setImage(icon, for:.normal)
            return btn
        }()
        // 随机播放按钮
        let btnRanm: UIButton = {
            let btn = UIButton(frame:CGRect(x:316, y:8, width:32, height:32))
            let onIcon = UIImage(named:"ranmonIcon")?.withRenderingMode(.alwaysOriginal)
            let offIcon = UIImage(named:"ranmoffIcon")?.withRenderingMode(.alwaysOriginal)
            //设置图标
            btn.setImage(offIcon, for:.normal)
            btn.setImage(onIcon, for:.highlighted)
            return btn
        }()
        // 进度条
        let progressBar: UIView = {
            let view = UIView(frame:CGRect(x:0, y:-1, width:self.view.bounds.size.width, height:2))
            view.backgroundColor = UIColor(red: 107/255, green: 123/255, blue: 212/255, alpha: 1.0)
            
            return view
        }()
        ctrlView.addSubview(progressBar)
        ctrlView.addSubview(btnLoop)
        ctrlView.addSubview(btnPrev)
        ctrlView.addSubview(btnPlayMode)
        ctrlView.addSubview(btnNext)
        ctrlView.addSubview(btnRanm)

6. 歌曲列表部分是一个tableview

        // MARK: -  初始化tableView
        tableView = {
            let table = UITableView(frame: CGRect(x:0, y:275,width:self.view.bounds.size.width, height:392))
            table.delegate = self
            table.dataSource = self
            table.bounces = false
            // 创建一个重用的单元格
            table.register(UITableViewCell.self, forCellReuseIdentifier: "SongList")
            table.rowHeight = 44
            //自适应高度
            //table.rowHeight = UITableViewAutomaticDimension
            // 去除多余的单元格
            table.tableFooterView = UIView()
            // 去除滚动条
            table.showsVerticalScrollIndicator = false
            // 设置分割线的颜色和内边距
            table.separatorColor = UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 0.6)
            table.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            // 设置cell的背景色为透明
            table.backgroundColor = UIColor.clear;
            return table
        }()

tableview除了界面还需要初始化相应的方法

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 12
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let identifier = "SongList"
//        let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as UITableViewCell
        let cell = UITableViewCell(style: UITableViewCellStyle.subtitle,reuseIdentifier: identifier)
        // 设置单元格的样式
        cell.textLabel?.text = "label"
        cell.textLabel?.textColor = UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 0.6)
        cell.textLabel?.highlightedTextColor = .white
        cell.detailTextLabel?.text = "detail"
        cell.detailTextLabel?.textColor = UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 0.5)
        cell.detailTextLabel?.highlightedTextColor = UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 1.0)
        cell.backgroundColor = UIColor.clear
        // 选中背景修改成紫色
        cell.selectedBackgroundView = UIView()
        cell.selectedBackgroundView?.backgroundColor = UIColor(red: 156/255, green: 169/255, blue: 232/255, alpha: 1.0)
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }

完成所有界面布局后如下图所示:

1709268-79893dec582c48b2.png
screenshot.png
2014-10-23 09:48:00 weixin_30502965 阅读数 2

本文转载至 http://www.itjhwd.com/wzkfyigeswiftsjs/


译者注:本文作者Greg Heo,这是他为讲授iOS 8 App Extensions视频教程而实际使用Swift开发了一款App的经验,来看看他的心得体验。

这个夏天我的app开发项目是Instant Poetry 2,它原本是Ray还是独立iOS开发者时编写的一个应用,现在我需要用Swift和iOS 8 API将它整个重写一遍。

对我来说这是一次丰富的学习体验 – 不但深入学习Swift和iOS 8的复杂细节,还思考了在未来如何更好的将这些经验传授给别人。

这里我就将在开发第一个Swift app过程中学到的四件事,分享给大家。

4) Swift仍然在演变当中

在整个夏天,Swift语言本身有了不少变化。我开始编写app时使用的Swift版本是beta 3,而每一次Xcode版本升级都带来语法变化和Cocoa方法签名的微调。

我在开发第一个Swift App过程中学到的四件事 - 第1张  | IT江湖

 

如果你计划使用Swift开发应用,你需要花精力关注这些变化并跟上Swift演进的步伐。

不过我认为这种精力花费的值得。使用最新和最好的工具是很重要的,另外关注语言的演变本身也将成为很好的学习经验。苹果一直关注和倾听来自开发者对于Swift的反馈和问题报告,所以你甚至有机会参与到这个语言成型的进程当中。

3) Swift暴露出Cocoa不太好的一面

你是否期望获取一个包含多个SKProduct对象的Swift数组?抱歉,Cocoa将返回给你包含AnyObject的隐式解析可选类型的数组(implicitly unwrapped optional array)。

你是否想传递一个[NSObject: AnyObject]类型的Swift数组给对应的方法?抱歉,Cocoa真正想要的是一个NSDictionary,或者一个会导致静默失效(silently fail)的东西。

你能够感觉到Swift和Cocoa之间的紧张气氛:Swift想要做某件事,但它不得不为了适应Cocoa而做折衷。我们必须面对这样一个事实,从Swift透镜来看Cocoa并不总是漂亮的!

 

我在开发第一个Swift App过程中学到的四件事 - 第2张  | IT江湖

 

这里有一个坏消息和一个好消息。

坏消息是我们正处在一个过渡当中,苹果在每次Swift/Xcode升级中所做的一部分事情,就是清理Swift-Cocoa的接口,来让它们更好的兼容。

好消息是苹果很善于过渡,你可以回想一下从PowerPC到Intel处理器的过渡、经典Mac OS到OS X的过渡等等。未来的某一天,Cocoa也将会原生的完美支持Swift语言。

2) Swift和Objective-C是幸福的一对

真的,这是我之前观点的一个必然推论 – 你可能觉察到Swift某些地方挺怪异,是因为它需要在Objective-C runtime和Objective-C API下工作,所以只能做出妥协。

 

 

 

我在开发第一个Swift App过程中学到的四件事 - 第3张  | IT江湖

 

 

从实际开发来看,在我的Swift app里使用Objective-C第三方类库和扩展非常简单,我只需要将它们的头文件导入到我的bridging header,它们就能正常工作了。

如果你有一个喜欢的库是用Objective-C编写的,或者已有的app,你想要在它们当中添加一两个Swift类,这不是个什么大问题。

1) Swift非常好玩

我很享受和Swift一起玩耍工作的日子。

它极富表现力。像自判断链接(optional chaining)和nil coalescing特性能让你写出更短的代码。让我最惊讶的是枚举类型给我带来的享受 – 它的确是一个双赢,让你代码更具可读性,还包括附加的好处比如类型检查和实例穷举检查。

 

 

我在开发第一个Swift App过程中学到的四件事 - 第4张  | IT江湖

 

作为Objective-C和Ruby的粉丝,我觉得Swift就像集合了这两种语言优点的混血儿。如果你学过Objective-C和Cocoa,阅读起Swift代码将没有任何困难,如果你还没有开始学习,那么就从现在开始用Swift开发一个简单的应用吧!

附加感受:Extension将改变世界!

至少对于苹果的世界是这样。在iOS 8里,苹果引入了app extension,允许开发者通过app扩展实现自定义分享选项、通知、键盘以及照片。

在Instant Poetry 2里,我使用了一个Photo Extension,让用户能够直接在Photo应用里添加词句到图片上。在这iOS 8以前是不可能做到的。

 

 

我在开发第一个Swift App过程中学到的四件事 - 第5张  | IT江湖

 

应用们从此不再被局限在自己的sandbox里了,貌似新的开放的苹果将让app能够从更多的地方做更多的事情,这是多么美好的事啊。

即便是即将到来的Apple Watch,它也是iPhone屏幕的一个扩展,我等不及想知道我们到底能用Watch Kit来做些什么。

也许我下个Swift app将是和Apple Watch有关呢!~

那么未来将是什么样的?

我的预测是,Swift的一些粗糙的地方将在短时间内被反复打磨。很快,Swift开发的应用将会无处不在,并且在Github上,Swift项目将远远超过Objective-C。

不过如果你现在开始开发Swift应用的话,你将会面临一些挑战。由于Swift的快速演变,我认为Swift 1.0项目迁移到Swift 2.0需要做不少工作,虽然比起从Objective-C迁移到Swift肯定要轻松一些。

不过这也正是我们热爱科技的原因,不是吗?学习新知识、跟上潮流、使用最新最好的语言和API,这些能让我保持兴奋。

 

 

我在开发第一个Swift App过程中学到的四件事 - 第6张  | IT江湖

 

最后,如果你想看看Instant Poetry 2能做什么,你可以从App Store免费下载。

你是否已经开始你的Swift开发旅程呢?如果是的话,我想听听你的体验看法。

 

原文:Four Things I Learned Making My First Swift App 译文:cocoachina

 

IT江湖 swift专栏

转载于:https://www.cnblogs.com/Camier-myNiuer/p/4045040.html

没有更多推荐了,返回首页