書いて覚えるSwift入門
第49回 Swift 5が来た!
Swift 5 has come
今回は当初予定ではSwiftとメモリ管理の話の続きを書く予定でしたが,
Source Compatible w/ Swift 4. x
では慌てる必要はあるかというと,
ABI frozen
ところが
またこれにより,
#"Raw String"# at last!
Swift 5は前述のとおりSwift 4互換ですが,
今までSwiftの文字列リテラル中のバックスラッシュ\は必ず文字エスケープとして解釈され,''
がずっと未使用で,q()
やRubyの%q()
に相当する,
let s0 = "\\n\n"
let s1 = #"\n\#n"#
s0 == s1 // true
おわかりいただけただろうか。つまり,#"
でquote"。#
でunquote。\#
でescapeというしくみ。おもしろいのは#
を複数重ねて##"
でquote"。##
でunquote。\##
でescapeにもできること。Swift 4から導入済みの"""
も#"""…"""#
に対応しています。
let multiline = #"""
だっ…誰があんたの事なんか
いつもいつも変なこと言って
すごく嫌われてるの判んないの!?
きもち悪いわよ!!
"""#
驚くべきことに,''
`
Result<Success,Failure:Error>
Swiftの例外処理は,throw
する可能性のある函数をtry
して,throw
されたらcatch
するというものです。
import Foundation
do {
let u = URL(string:"https://example.com")!
let s = try String(contentsOf: u)
print(s)
} catch {
print(error)
}
try?
もあるので,catch
不要の場合は次のようにもできます。
let u = URL(string:"https://example.com")!
if let s = try? String(contentsOf: u) {
print(s)
}
しかし,Result
型がその期待に応えてくれます。
let u = URL(string:"https://example.com")!
let r = Result { try String(contentsOf: u) }
Result
はenum
なので,
switch(r) {
case let .success(value):
value
case let .failure(error):
error
}
また.get()
することで,do {} catch {}
しなおすこともできます。
do {
let s = try r.get()
print(s)
} catch {
print(error)
}
ExpressibleByStringInterpolation
Swiftの文字列展開"\(expression)"
のexpression
が文字化されて展開されます。これまではexpression
がCustomStringConvertible
プロトコルに準拠している場合は.description
プロパティの値が,
リスト1 文字列展開サンプル
struct Point2D<T:Numeric> {
var x:T
var y:T
}
extension String.StringInterpolation {
mutating func appendInterpolation<T:Numeric>(_ value: Point2D<T>) {
appendInterpolation("(\(value.x), \(value.y))")
}
}
let p = Point2D(x:3.0, y:4.0)
print(p) // "Point2D(x:3.0, y:4.0)"
print("\(p)") // (3.0, 4.0)
lessStringattached
Swift Blogの3月20日付記事にもあるとおり,String
の内部実装がASCIIとUTF-16を切り替える方式から一元的にUTF-8
を用いる方式に変わりました
これにより,.withCString
メソッドはわざわざCの文字列を生成する必要がなくなり,
isMutiple(of:)
isMultiple(of:)
メソッドが追加されました。実装としては,
extension BinaryInteger { // 名前はわざと変えてある
func isDivisible(by: Self)->Bool {
return self % by == 0
}
}
程度の簡単なものですが,isEven
およびisOdd
もありましたが,isMultiple(of:)
だけ定義されています。
令和はまだ未対応
リリースが3月25日だということからもわかるとおり,
リスト2 令和はまだ未対応
"\u{337E}".decomposedStringWithCompatibilityMapping // "明治"
"\u{337D}".decomposedStringWithCompatibilityMapping // "大正"
"\u{337C}".decomposedStringWithCompatibilityMapping // "昭和"
"\u{337B}".decomposedStringWithCompatibilityMapping // "平成"
"\u{32FF}".decomposedStringWithCompatibilityMapping // まだ"令和"じゃない!
以上駆け足でSwift 5を眺めていきましたが,#""#
のような後出しじゃんけんっぷりは健在で,
本誌最新号をチェック!
Software Design 2019年12月号
2019年11月18日発売
B5判/200ページ
定価(本体1,220円+税)
- 第1特集
サーバーレスでめざせ! インフラ管理ゼロなシステム
基本のAWS Lambdaからフルサーバーレスまで - 第2特集
12月6日発売『みんなのPHP』コラボ!
PHPプログラミング・アラカルト
なぜ愛され,なぜ進化するのか? - 短期連載
Webサービスを裏で支える!! バッチ処理設計の勘所
【1】バッチ処理の特徴と設計のポイント - 短期集中連載
Webエンジニアのための時短スマホアプリ開発
【2】React.jsをおさらいし,React NativeによるUI構築の基本を知ろう