Skip to content

Instantly share code, notes, and snippets.

@es-kumagai
es-kumagai / CodePiece.swift
Created February 24, 2023 10:12
@lococo85327937 そしてそんな総称プロトコル?を型として扱えるのだからそれを「総称型」と呼んでも良いよね⋯Swift 5.8 から P<Element> とも書けるし — みたいに解釈すれば辿りつくものの、些か強引な感じがするのでたぶん間違えました。 #CodePiece
protocol P<Element> {
associatedtype Element
var first: Element? { get }
}
extension Array : P {
}
let x: any P<Int> = [1, 2]
@es-kumagai
es-kumagai / CodePiece.swift
Created February 24, 2023 10:04
@lococo85327937 ついでにそうしたら、これは「総称プロトコル」というのか ⋯ 聞いたことない言葉になってきますけれど、ジェネリックなプロトコルをそう呼べば良いなら、総称プロトコルと呼んでも正しそう(自信はない) #CodePiece
protocol P {
associatedtype Element
}
@es-kumagai
es-kumagai / CodePiece.swift
Created February 24, 2023 10:01
@lococo85327937 同じように型パラメーターを扱えるものとして、総称関数。このコード例の最初の A であればたしかに「総称関数」として納得感があるのですけれど、じゃあ B は?となると疑問が出てきて、自分が間違ってた感が窺えてきます。 #CodePiece
// A. 総称関数
func action<Value: P>(_ value: Value) {
}
// B. これは、総称関数?
func action(_ value: P) {
}
@es-kumagai
es-kumagai / CodePiece.swift
Created February 24, 2023 09:55
@lococo85327937 改めて調べて整理してみると、総称型というと一般に、ジェネリクス(総称)を応用して作られた型、型パラメーターを用いて作られた型そのものを指す様子でした。たしかにしっくりくる感じがします。 #CodePiece
struct MyType<Element> {
var value: Element
}
@es-kumagai
es-kumagai / CodePiece.swift
Created February 4, 2023 07:29
これも "if let shorthand" ⋯ ? と思うと、なんとなく "optional binding shorthand" とかのほうが命名の上では適切かもしれないような。 #CodePiece
guard var value else {
}
@es-kumagai
es-kumagai / CodePiece.swift
Created January 27, 2023 16:48
while let shorthand ⋯ #CodePiece
var values = [1, 2, 3, 4, 5]
var value: Int? { values.popLast() }
while let value {
print(value)
}
@es-kumagai
es-kumagai / CodePiece.swift
Created January 17, 2023 13:37
先ほどのコードに、インスタンスが具体的にどう扱われているかを窺うコードを追加。内部的な扱いは同じ様子でも、型注釈を明記すると自己準拠性の扱いが変わってくるみたい。 #CodePiece
something(a) // "some A"
something(b) // "some A"
something(c) // "some A"
something(a as A) // "Any"
something(b as A) // "Any"
something(c as A) // "Any"
MemoryLayout.size(ofValue: a) // 8
MemoryLayout.size(ofValue: b) // 40
MemoryLayout.size(ofValue: c) // 40
@es-kumagai
es-kumagai / CodePiece.swift
Created January 17, 2023 13:03
いわゆる存在型の展開のうごき、少しばかり癖のある動きを見せる感じね。 #CodePiece
protocol A {}
extension Int : A {}
func something(_ value: Any) -> String { return "Any" }
func something(_ value: some A) -> String { return "some A" }
let a: Int = 0
let b: A = 0
let c = a as A
@es-kumagai
es-kumagai / CodePiece.swift
Created January 15, 2023 07:52
当然とも言えそうだけれど、シャドーイングする前に defer を仕掛けておけば、隠された側の後始末も普通に可能そうね。 #CodePiece
var value: Int? = 100
do {
defer {
value = nil
}
let value = value.map { $0 * 2 } ?? 0
print(value)
}
@es-kumagai
es-kumagai / CodePiece.swift
Created November 15, 2022 13:43
ゆめみさんの社内勉強会「やさしい Swift 勉強会 #140」(じきに公開される予定)を振り返ってみていて思うけれども、こういう奇特な 36 進数変換みたいな機能を標準ライブラリーに組み込む人ってどんな気持ちなのでしょうね。 #yumemi_grow #CodePiece
let possibleNumber = "helloworld"
let convertedNumber = Int(possibleNumber, radix: 36)