xcode9开发swift

2019-12-14 05:44:15 liumiaocn 阅读数 754

在这里插入图片描述
我们使用XCode 11.3创建一个基于Swift的的Hello World应用示例。

事前准备

安装XCode 11.3,本文示例只是添加一句NSLog,实际上版本相差不大,后续的构建和生成ipa方面不同版本差别还是有一些的。

liumiaocn:~ liumiao$ xcodebuild -version
Xcode 11.3
Build version 11C29
liumiaocn:~ liumiao$ 

创建Hello World应用

使用XCode创建一个Hello World的应用非常简单,使用如下步骤即可:

步骤1: 创建一个新的XCode工程

打开XCode之后,选中如下Create a new XCode project选项
在这里插入图片描述

Step 2: 选中Single View App并设定

选中下图中的Single View App模版,然后点击Next按钮
在这里插入图片描述
在接下来的设定中设定此工程相关的各个选项,输入的选项对于开发影响不大,但是对于后续构建以及构建之后上线则影响较大,需要有开发者账号和证书信息,此处只是为了本地开发和运行,可暂时随便输入,可在后续在工程设定中进行修改。
在这里插入图片描述

注意:此处选择Langeuage为Swift,User Interface为Storyboard

Step 3: 添加Hello World的Lable

上述页面在点击Next按钮选择保存场所之后就生成了此demo工程。
在这里插入图片描述

工程初始化时创建的相关文件信息如下所示:

liumiaocn:swift liumiao$ tree .
.
├── swift
│   ├── AppDelegate.swift
│   ├── Assets.xcassets
│   │   ├── AppIcon.appiconset
│   │   │   └── Contents.json
│   │   └── Contents.json
│   ├── Base.lproj
│   │   ├── LaunchScreen.storyboard
│   │   └── Main.storyboard
│   ├── Info.plist
│   ├── SceneDelegate.swift
│   └── ViewController.swift
├── swift.xcodeproj
│   ├── project.pbxproj
│   ├── project.xcworkspace
│   │   ├── contents.xcworkspacedata
│   │   ├── xcshareddata
│   │   │   └── IDEWorkspaceChecks.plist
│   │   └── xcuserdata
│   │       └── liumiao.xcuserdatad
│   │           └── UserInterfaceState.xcuserstate
│   └── xcuserdata
│       └── liumiao.xcuserdatad
│           └── xcschemes
│               └── xcschememanagement.plist
├── swiftTests
│   ├── Info.plist
│   └── swiftTests.swift
└── swiftUITests
    ├── Info.plist
    └── swiftUITests.swift

14 directories, 17 files
liumiaocn:swift liumiao$

点击Main.storyboard文件,然后点击右上的+按钮,再出现的控件列表中选中Lable
在这里插入图片描述
拖动此Lable到面板上,然后修改Lable的内容如下图所示:
在这里插入图片描述
这样,最简单的Swift的Hello World的示例工程也已经敷衍地完成了。

运行应用

使用Command + R可以模拟运行此应用,结果如下所示。
在这里插入图片描述

总结

使用XCode可以非常简单的生成一个基于Swift的工程应用,在后续可以使用xcodebuild或者fastlane对其进行打包操作。

2018-11-05 23:00:24 Takioo 阅读数 1099

更多原创文章,请访问:https://takioo.cn

随着 Xcode9 Swift 4.0 的到来,一些小问题也接踵而至。

 

许多优秀的 Swift 第三方框架还没有来得及迎接 Swift 4.0 的到来,它们还停留在 Swift3.x 的状态。

这个时候新建一个项目,使用cocoapods 引入所需的第三方,即使 pod install 成功后,一编译工程就是满屏红,

且报错 Swift compiler Error,如下图:

不过所幸,苹果每次升级 Xcode 都会保留上个版本的 swift。

 

解决方案,控制编译时第三方框架所使用的 Swift 版本,有如下两种方法。

方法1. 在 Xcode 设置中手动为每个需要指定 swift 版本的第三方框架设置 swift 版本,如下图:

方法2. 在podfile 文件中,使用 Cocoapods 控制 :

platform :ios, '9.0'
post_install do |installer|
    # 需要指定swift编译版本的第三方的名称
    myTargets = ['Charts','Moya']
    installer.pods_project.targets.each do |target|
        if myTargets.include? target.name
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '3.2'
            end
        end
    end
end

use_frameworks!

target 'xxxx' do

pod 'IQKeyboardManager', '~>4.0.6'
pod 'JSONModel'
pod 'KVOController'
pod 'MagicalRecord'
pod 'Mantle'
pod 'MJRefresh'
pod 'Masonry'
pod 'Moya'
pod 'ReactiveSwift'
pod 'SDWebImage'
pod 'SwiftyJSON'
pod 'SDCycleScrollView'
pod 'Charts', '~> 3.0.1'

end

然后再 pod install 一下就可以了。

2017-09-14 13:07:29 youshaoduo 阅读数 8121

New Build System


Xcode 9 引入了 New Build System,可在 Xcode 9 的 File -> Project Settings... 中选择开启。



预编译 Bridging Headers 文件


对于 Swift 和 Objective-C 混合的项目,Swift 调用 Objective-C 时,需要建立一个 Bridging Headers 文件,然后把 Swift 要调用的 Objective-C 类的头文件都写在里面,编译器会读取 Bridging Headers 中的头文件,然后生成一个庞大的 Swift 文件,文件内容是这些头文件内的 API 的 Swift 版本。然后编译器会在编译每一个 Swift 文件时,都要编译一遍这个庞大的 Swift 文件的内容。

有了预编译 Bridging Headers 以后,编译器会在预编译阶段把 Bridging Headers 编译一次,然后插入到每个 Swift 文件中,这样就大大提高了编译速度。

苹果宣称 Xcode 9 和 Swift 4 对于 Swift 和 Objective-C 混合编译的速度提高了 40%。


Indexing 可以在编译的同时进行


用 Swift 开发项目时,近几个版本的 Xcode 进行 Indexing 的速度慢的令人发指。Xcode 9 和 Swift 4 在这方面做了优化,可以在编译的同时进行 Indexing,一般编译结束后 Indexing 也会同时完成。


COW Existential Containers


Swift 中有个东西叫 Existential Containers,它用来保存未知类型的值,它的内部是一个 Inline value buffer,如果 Inline value buffer 中的值占用空间很大时,这个值会被分配在堆上,然而在堆上分配内存是一个性能比较慢的操作。

Swift 4 中为了优化性能引入了 COW Existential Containers,这里的 COW 就代表 “Copy-On-Write”,当存在多个相同的值时,他们会共用 buffer 上的空间,直到某个值被修改时,这个被修改的值才会被拷贝一份并分配内存空间。



移除未调用的协议实现


看下面的例子,Date 实现了 Equatable 和 Comparable 协议。编译时如果编译器发现没有任何地方调用了对 Date 进行大小比较的方法,编译器会移除 Comparable 协议的实现,来达到减小包大小的目的。
struct Date {
    private let secondsSinceReferenceDate: Double
}
extension Date: Equatable {
    static func ==(lhs: Date, rhs: Date) -> Bool {
        return lhs.secondsSinceReferenceDate == rhs.secondsSinceReferenceDate
    }
}
extension Date: Comparable {
    static func <(lhs: Date, rhs: Date) -> Bool {
        return lhs.secondsSinceReferenceDate < rhs.secondsSinceReferenceDate
    }
}


减少隐式 @objc 自动推断


在项目中想把 Swift 写的 API 暴露给 Objective-C 调用,需要增加 @objc。在 Swift 3 中,编译器会在很多地方为我们隐式的加上 @objc,例如当一个类继承于 NSObject,那么这个类的所有方法都会被隐式的加上 @objc。
class MyClass: NSObject {
    func print() { ... } // 包含隐式的 @objc
    func show() { ... } // 包含隐式的 @objc
}

这样很多并不需要暴露给 Objective-C 也被加上了 @objc。大量 @objc 会导致二进制文件大小的增加。

在 Swift 4 中,隐式 @objc 自动推断只会发生在很少的当必须要使用 @objc 的情况,比如:

复写父类的 Objective-C 方法
符合一个 Objective-C 的协议
其它大多数地方必须手工显示的加上 @objc。

减少了隐式 @objc 自动推断后,Apple Music app 的包大小减少了 5.7%。



Exclusive Access to Memory


在遍历一个 Collection 的时候可以去修改每一个元素的值,但是在遍历时如果去添加或删除一个元素就可能会引起 Crash。
例如为 MutableCollection 扩展一个 modifyEach 方法来修改每个元素的值,代码如下:

extension MutableCollection {
    mutating func modifyEach(_ body: (inout Element) -> ()) {
        for index in self.indices {
            body(&self[index])
        }
    }
}

假如在调用 modifyEach 时去删除元素:
var numbers = [1, 2, 3]
numbers.modifyEach { element in
    element *= 2
    numbers.removeAll()
}

就会在运行时 Crash。
Swift 4 中引入了 Exclusive Access to Memory,使得这个错误可以在编译时被检查出来。


兼容性


Xcode 9 中同时集成了 Swift 3.2 和 Swift 4。
Swift 3.2 完全兼容 Swift 3.1,并会在过时的语法或函数上报告警告。
Swift 3.2 具有 Swift 4 的一些写法,但是性能不如 Swift 4。
Swift 3.2 和 Swift 4 可以混合编译,可以指定一部分模块用 Swift 3.2 编译,一部分用 Swift 4 编译。
迁移到 Swift 4 后能获得 Swift 4 所有的新特性,并且性能比 Swift 3.2 好。
总结:当 Xcode 正式版发布后,现有的 Swift 代码可以直接升级到 Swift 3.2 而不用做任何改动,后续可以再迁移到 Swift 4。或者直接迁移到 Swift 4 也可以,Swift 4 相比 Swift 3 的 API 变化还是不大的,很多第三方库都可以直接用 Swift 4 编译。Swift 1 到 2 和 Swift 2 到 3 的迁移的痛苦在 3 到 4 的迁移上已经大大改善了。

2018-06-24 22:14:21 sunxiaoju 阅读数 3598

1、打开xocde,创建一个工程,如下图所示:


2、选择macOs中的Command Line Tool项目,然后点击next,如下图所示:


3、输入Product Name的名称,Organization Identifier的名称,点击Next,如下图所示:


4、然后选择保存工程的路径。

5、创建之后已经存在一个main.swift文件,如下图所示:


6、点击右三角运行,如下图所示:


7、运行成功之后就会在下边输出Hello,world!,如下图所示:


2016-05-06 22:07:53 testcs_dn 阅读数 18411

最近也想试水一下iOS应用开发,但又没有Apple Air/Pro之类的设备,也不想装OS X系统,

就想到能不能在Windows或者ubuntu下安装XCode6环境来开发Swift?

但经过一翻搜索,得到的答案是:XCode只能装在OS X系统上。


据我了解目前Windows下是无法安装Swift编译运行环境的,有的文章为了吸引眼球,直接把标题写成“Windows下用xcode开发swift程序的图文教程”,打开一看,就是要安装虚拟机,安装MacOS系统的。

如果你不是为了编写 iOS 和 OS X 应用,只是想学习了解一下Swift的语法,又或者用Swift写个服务,做Web后端开发的话(什么?Swift可以做Web后端开发?我没听错吧!没错,这是真的!将来Swift可以开发Android应用,或是Windows程序都有可能!),在Ubuntu下是没有问题的,参考:Ubuntu 14 server安装Swift运行环境


另外在搜索过程中还了解到:Ubuntu下可以安装Object-C的编译环境,不过我没有试过行不行,有兴趣的可以参考:

Ubuntu下Object-C开发环境搭建


将来Swift或者可以开发Android应用,这不是我意淫,可以参考谷歌酝酿将苹果Swift作为安卓APP主要开发语言

Swift可以做Web后端开发,没错,这个我已经试过了,

可以参考:ubuntu下编译运行Swift开发的Web后端示例

只是我现在还没有发现比较好的框架可以用。