[Swift] URLを理解する (1: URI を扱う)

     
⌛️ 2 min.

URL 型で URI を扱う時の方法を確認します。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS15.0.1 Sequoia
  • Xcode 16.1 Beta3
  • iOS 18.1
  • Swift 5.9
URL 説明シリーズ
[Swift] URLを理解する (1: URI を扱う) [Swift] URLを理解する (2: ファイルパス を扱う) [Swift] URLを理解する (3: パスを操作する) [Swift] URLを理解する (4: ApplePlatform)

URL

URL という型は、リソースの位置を(それがローカルにあるのかリモートにあるのかにかかわわず) 表現する型です。

いわゆる ネットワーク上でのアドレスを表現しています。

詳細について 参照すべきドキュメント は W3C の RFC3986 です。

URI を表現するために Apple が提供している URL 型のドキュメントは以下です。


参考
URLApple Developer Documentation

ちなみに、URL は “Uniform Resource Locator” の省略型です。

HTTPS を例として使ってみる

URL の使い道の1つは、ネットワーク上のリソースを指し示すことです。

URL では、位置情報に加えてどのようにアクセスするかの スキーム情報も含んでいます。

この記事では、よく使われるであろう HTTPS での URL について 確認していきます。

イニシャライザ (init)

まずは、イニシャライザです。

URL の一般的なイニシャライザは、URL.init?(string:)です。

参考
init(string:)Apple Developer Documentation

MEMO

URL の別の用途としてファイルパスを表現することがありますが、そのための イニシャライザは、別途用意されています。

import Testing
import Foundation

struct URL_URITests {
    @Test func http_access() async throws {
        let sut = URL(string: "https://example.com:8080/hello/world")!

        #expect(sut.absoluteString == "https://example.com:8080/hello/world")

        #expect(sut.scheme! == "https")
        #expect(sut.host()! == "example.com")
        #expect(sut.port! == 8080)
    }
}

URI は、以下のように scheme, authority, path, query, fragment で構成されます。(詳細はRFC を確認してください)

URI

コードで使用しているものは、”https:” で始まっているので、https スキーマに沿った URI ということです。

ですので、URL からスキーマを取得すると “https” になっています。
さらに、host 部分として、”example.com” を、
port 番号として、”8080″ を認識していることがわかります。
(RFC で authority と呼ばれている箇所です)

# この記事では、query や fragment は、扱いません

また、以下のように、相対的な指定での URI も作成できます。

import Testing
import Foundation

struct URL_URITests {
    @Test func http_relativeURL() async throws {
        let baseURL = URL(string: "https://example.com:8080")!
        let sut = URL(string: "/hello/world", relativeTo: baseURL)!

        #expect(sut.baseURL?.absoluteString == "https://example.com:8080")
        #expect(sut.absoluteString == "https://example.com:8080/hello/world")

        #expect(sut.scheme! == "https")
        #expect(sut.host()! == "example.com")
        #expect(sut.port! == 8080)
    }}

上記のように、relativeTo へ、相対パスのベースとなる URL を渡すことで、その位置からの相対パスでファイルパスを作成できます。

取得

URL の部分的な情報を取得したいことはよくあります。

以下のような URL の情報を取得できるようなメソッドが用意されています。

path(): String
URL のパスを取得
pathComponents: [String]
ファイルパスを分割して取得
lastPathComponent: String
最終要素の取得
pathExtension: String
ファイルの拡張子を取得

以下は、先ほどの例で作成した2つのURLについて取得した例です。

struct URL_URITests {

    @Test func http_URL() async throws {
        let sut = URL(string: "https://example.com:8080/hello/world")!

        #expect(sut.absoluteString == "https://example.com:8080/hello/world")

        #expect(sut.scheme! == "https")
        #expect(sut.host()! == "example.com")
        #expect(sut.port! == 8080)

        #expect(sut.path() == "/hello/world")
        #expect(sut.pathComponents == ["/", "hello", "world"])
        #expect(sut.lastPathComponent == "world")
        #expect(sut.pathExtension == "")

    }

    @Test func http_relativeURL() async throws {
        let baseURL = URL(string: "https://example.com:8080")!
        let sut = URL(string: "/hello/world", relativeTo: baseURL)!

        #expect(sut.baseURL?.absoluteString == "https://example.com:8080")
        #expect(sut.absoluteString == "https://example.com:8080/hello/world")

        #expect(sut.scheme! == "https")
        #expect(sut.host()! == "example.com")
        #expect(sut.port! == 8080)

        #expect(sut.path() == "/hello/world")
        #expect(sut.pathComponents == ["/", "hello", "world"])
        #expect(sut.lastPathComponent == "world")
        #expect(sut.pathExtension == "")

    }
}    

まとめ

URL で URI を扱うときのメソッドを確認しました。

URI を扱う URL
  • URL(string:) で init する
  • 絶対パス、相対パス のいずれからも作成できる
  • 相対パスから作成するときはベースの URL が必要
  • パス、パス最終要素、パス最終う要素拡張子等を取得するメソッドが用意されている
  • パスを分解して取得するメソッドも用意されている

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です