内容简介:作者:Ole Begemann,译者:EyreFree;校对:liberalism,Firecrest;定稿:Swift 3.1 修复了
作者:Ole Begemann, 原文链接 ,原文日期:2017-04-07
译者:EyreFree;校对:liberalism,Firecrest;定稿: CMB
Swift 3.1 修复了 Swift Package Manager 无法重写 MacOS 部署目标的 Bug。
当你在 macOS 上执行 swift build
命令时,包管理器目前(Swift 3.0 和 3.1)会将部署目标硬编码为 macOS 10.10 ¹ 现已证明是命令参数的一个 Bug
引起的 Swift 3.0 中无法重写部署目标这个问题。
因此,你不能轻松编译用到了最新 API 的代码 ² 举个栗子,假设有一个非常简单的包,只包含几行代码在一个源文件中。这个程序用到了 macOS 10.12 引入的新的 单位和测量类型 来将一个值从以 km/h 转换为 m/s :
// main.swift import Foundation let kph = Measurement(value: 100, unit: UnitSpeed.kilometersPerHour) let mps = kph.converted(to: .metersPerSecond) print("\(kph) is \(mps)")
在 macOS(Swift 3.0 或 3.1)上用 swift build
命令编译上面这段代码会报错,因为这段代码用到的 API 在 macOS 10.10 上不可用:
$ swift build Compile Swift Module 'Units' (1 sources) main.swift:3:11: error: 'Measurement' is only available on OS X 10.12 or newer let kph = Measurement(value: 100, ^ main.swift:3:11: note: add 'if #available' version check let kph = Measurement(value: 100, ^ ... <unknown>:0: error: build had 1 command failures error: exit(1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f .build/debug.yaml
在 Swift 3.1 中,你可以在命令行中修改部署目标,如下所示:
$ swift build -Xswiftc "-target" \ -Xswiftc "x86_64-apple-macosx10.12" Compile Swift Module 'Units' (1 sources) Linking ./.build/debug/Units
现在,你可以正常执行之前的这段代码了:
$ .build/debug/Units 100.0 km/h is 27.7778 m/s
结论
除了部署目标,另一个常见的自定义编译设置例子是传递一个 DEBUG
标志给编译器,所以可以在你的代码中使用 #if DEBUG/#endif
代码段作为标志传递给编译器,从而来判断是否处于 Debug 模式 - 当前包管理器并没有在 Debug 构建模式下自动完成这些工作。你可以通过 swift build -Xswiftc "-D" -Xswiftc "DEBUG"
命令实现这一目的。
这仍然不够理想 - 你在每次执行 swift build
或 swift test
命令时都需要手动输入命令行参数 - 但至少这是可行的。
对于包管理器来说能够在包配置清单中指定自定义编译设置是 Swift 4 路线图 的一部分。我猜我们很快就会看到一个和这一特性有关的 Swift 发展提案 。
-
你可以通过添加如下代码段到你的
main.swift
文件然后编译并执行对应包的方式来验证这一点:
#if os(macOS) print("macOS deployment target:", __MAC_OS_X_VERSION_MIN_REQUIRED) #endif
如果在 macOS 执行,将会打印:
macOS deployment target: 101000
-
你必须把所有依赖新 API 的代码用
if #available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) { ... }
或类似的 block 进行包裹。
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问http://swift.gg。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 能用js重写的都会被typescript重写
- 重写equals的详细说明
- SpringSession:请求与响应重写
- 什么时候要重写equals
- 如何重写object虚方法
- 重写Jekyll的Relate功能
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
创业就是要细分垄断
李开复、汪华、傅盛 / 文化发展出版社 / 2017-5-1 / CNY 45.00
对各方面资源极为有限的创业公司而言,想在激烈的市场竞争中站立下来的第一步是:成为细分市场的垄断者。不管是资本还是尖端人才,追逐的永远是行业里尖端的企业,第二名毫无意义。 首先,要精准定位潜在市场。这个市场的需求仍没有被满足,并且潜力巨大。其次,抓住时代和行业的红利,通过高速增长实现“小垄断”,抢滩登陆。最后,在细分领域里建立起自己的竞争壁垒,应对巨头和竞争对手的复制,去扩展更大的市场,从而扩......一起来看看 《创业就是要细分垄断》 这本书的介绍吧!