WWDC Quick Look 💓 By SwiftGGTeam
Formatters: Make data human-friendly

Formatters: Make data human-friendly

元の動画を見る

ハイライト

iOS 14 では、言語と地域の組み合わせに対する Formatter のサポートが改善され、DateFormatter、MeasurementFormatter、PersonNameComponentsFormatter、ListFormatter、NumberFormatter、stringsdict を使用して、アプリがユーザーの習慣に準拠した日付、単位、名前、リスト、数値、および複数の文字列を生成できるようにします。

主要内容

多くのアプリはデータを表示します。天気アプリでは気温、風速、気圧が表示され、ヘルスケアアプリでは統計傾向が表示され、メモではタイトルの下に変更時刻が表示されるだけです。これらのテキストがユーザー向けである限り、DateDoubleまたは、配列を直接文字列に入力します。単位、日付の順序、小数点、パーセント記号の位置、名前の順序はすべて、言語と地域によって異なります。

このセッションの入り口のケースは非常に特殊です。アブダビに住んでおり、携帯電話の言語がフランス語に設定されている人は、過去にフランス地域により慣れているデジタル形式を見たことがあるかもしれません。 iOS 14 とその同世代の macOS、watchOS、tvOS では、言語と地域の組み合わせにより適切な形式を取得するために、基礎となるアルゴリズムが改善されました。この変更は、多くの言語と地域の組み合わせに対応しており、システム Formatter を使用するアプリはシステムの改善から直接恩恵を受けることになります。

Karan Miśra は続けて、Foundation の書式設定ツールを「最も具体的なものから最も一般的なもの」の順に、日付と時刻、測定単位、名前、リスト、数値、SwiftUI のテキストと stringsdict について実演します。主な方針は、あまりカスタム言語ルールを記述せず、データ構造を Formatter に渡し、複数のルールを stringsdict に渡し、システムがロケールに従ってテキストを組み立てるようにすることです。

詳細

日付と時刻: スタイルとテンプレートを使用し、手書き形式は使用しないでください。

(02:25) メモの上部にある最終変更時刻を直接使用できますDateFormatterデフォルトのスタイル。スクリーン タイムは、そのようなインターフェイスで「日 + 日付 + 月」または非常に短い週の省略形が必要な場合に使用されます。setLocalizedDateFormatFromTemplate

// Date with Day/Month/Year and Time
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .short
dateFormatter.string(from: Date())

// Day of Week + Date + Month
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("MMMMdEEEE")
dateFormatter.string(from: Date())

// Abbreviated Day of Week
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("ccccc")
dateFormatter.string(from: Date())

キーポイント:

  • dateStyleそしてtimeStyle一般的な組み合わせに適しており、システムはロケールに一致する接続詞と順序を補完します。 -setLocalizedDateFormatFromTemplate("MMMMdEEEE")どのフィールドが必須であるかを記述し、フィールドの配置は Formatter に任せます。 -cccccUnicode 日付フィールド ルールから派生したもので、独立して表示される非常に短い曜日名に適しています。
  • トランスクリプトは、テンプレートを直接割り当てないことを明確に思い出させます。dateFormat、文字通りに解釈され、誤った結果が生成されやすくなります。

(05:56) 日付には、期間、時間間隔、相対時間も含まれます。DateComponentsFormatterDateIntervalFormatterそしてRelativeDateTimeFormatterこれらのシナリオを個別に説明します。

// Date and Time Components
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .abbreviated
let components = DateComponents(hour: 2, minute: 26)
formatter.string(from: components)

// Date and Time Intervals
let formatter = DateIntervalFormatter()
formatter.dateTemplate = "dMMM"
formatter.string(from: startDate, to: endDate)

// Relative Dates and Times
let formatter = RelativeDateTimeFormatter()
formatter.dateTimeStyle = .named
formatter.localizedString(from: DateComponents(day: -1))

キーポイント:

  • DateComponentsFormatter「2時間26分」って結構な長さですよね。 -DateIntervalFormatterこれにより、開始日と終了日で同じ要素が繰り返されることがなくなります。 -RelativeDateTimeFormatter昨日などの名前付き相対日付など、過去または未来の自然言語表現に適しています。

測定単位: 1 つの単位を保存し、別の地域の習慣を表示します

(06:29) 天気の例では、データ ソースはメートル法を使用しており、米国のユーザーに表示される場合、地域の習慣に従って華氏、時速マイル、その他の形式に変換されます。開発者は、単位変換やローカリゼーション文字列を自分で管理する必要はありません。

// Temperature
let formatter = MeasurementFormatter()
let temperature = Measurement<UnitTemperature>(value: 16, unit: .celsius)
formatter.numberFormatter.maximumFractionDigits = 0
formatter.string(from: temperature)

// Speed
let speed = Measurement<UnitSpeed>(value: 14, unit: .kilometersPerHour)
formatter.string(from: speed)

// Pressure
let pressure = Measurement<UnitPressure>(value: 1.01885, unit: .bars)
formatter.string(from: pressure)

キーポイント:

  • Measurement値と元の単位を保持し、MeasurementFormatterユーザーに表示される単位と形式を決定します。 -numberFormatter.maximumFractionDigits = 0数値精度を制御します。単位の位置特定は引き続きシステムによって処理されます。
  • トランスクリプトについて言及MeasurementFormatter多くの単位をサポートし、カスタム単位もサポートします。

名前: 名前の順序もイニシャルもハードコーディングできません。

(07:49) 名前は非常に個人的なデータです。PersonNameComponentsFormatter順序とスタイルは、ユーザーの言語設定、連絡先設定、名前そのものに基づいて選択されます。中国語、日本、韓国語の名前の場合は、デバイスの言語が英語であっても、名の前に姓を付けてください。

let formatter = PersonNameComponentsFormatter()
var nameComponents = PersonNameComponents()
nameComponents.familyName = "Iwasaki"
nameComponents.givenName = "Akiya"
nameComponents.nickname = "Aki-chan"

// Full Name
formatter.string(from: nameComponents)

// Short Name: Respects User Preferences
formatter.style = .short
formatter.string(from: nameComponents)

// Abbreviated Name
formatter.style = .abbreviated
formatter.string(from: nameComponents)

キーポイント:

  • PersonNameComponents姓、名、ニックネームを構造化データにします。 -.shortユーザーの好みが尊重され、ニックネームや短い名前が使用される場合があります。 -.abbreviatedアバターが欠落している場合のモノグラムに適していますが、長さと実際のレンダリング サイズを確認するためのセッション リマインダーです。

(08:31)モノグラムでは、すべての名前が表示に適していることを保証できません。迅速countユーザーに表示される文字をカウントするには、まずレイヤーの長さチェックを実行します。

formatter.style = .abbreviated
let monogram = formatter.string(from: nameComponents)
if monogram.count <= 2 {
    // Use Monogram
} else {
    // Use Icon
}

キーポイント:

  • countUnicode コードポイントの数ではなく、さまざまな言語のユーザーが見る文字に近い値です。
  • 文字数は単なる保護層です。最終的には、テキストの幅と高さが UI に収まるようにする必要があります。
  • 制限を超えた場合は、長いテキストによってアバター領域が引き伸ばされるのを避けるために、ユニバーサル アイコンに戻ります。

リストと数値: 構文の詳細はシステムに任せます

(10:15) リスト接続詞は言語とコンテキストによって変化します。 Session は、キーボード設定の言語リストを使用して、スペイン語の「および」が次の単語に応じて形式を変更することを示します。 iOS 14が同世代システムにアップデートされましたListFormatter、複数の言語の文法規則に準拠させます。

let items = ["English", "French", "Spanish"]
ListFormatter.localizedString(byJoining: items)

let items = ["English", "Spanish"]
ListFormatter.localizedString(byJoining: items)

let items = ["Spanish", "English"]
ListFormatter.localizedString(byJoining: items)

キーポイント:

  • ListFormatter.localizedString(byJoining:)配列を受け取り、ユーザーの言語で自然なリストを返します。
  • 配列の順序が変更されると、接続詞も変更される可能性があります。
  • システム API を使用した後、基礎となる実装の更新により、アプリが新しい言語ルールを取得できるようになります。

(12:01) デジタルリスクはさらに潜行性です。32.768地域によっては、30,000 または 32.768 を超えるものとして理解される場合があります。NumberFormatter小数点の区切り文字、数字の形状、パーセント記号の配置などの詳細が処理されます。

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.string(from: 32.768) // French (France)

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.string(from: 32.768) // Arabic (Egypt)

formatter.percentSymbol
formatter.decimalSeparator

キーポイント:

  • .decimal言語と地域ごとに単純な数値を出力させます。 -percentSymboldecimalSeparatorこのタイプの属性は、シンボル自体を読み取る必要があるシナリオに適しています。
  • セッションも表示されます.percent、トルコ環境では、数字の前にパーセント記号が付けられます。

SwiftUI Text: stringsdict に入れられた複数形ルール

(13:24) フォーマッタは一般的なデータ型をカバーしていますが、企業独自の文章は依然としてローカライズする必要があります。 SwiftUIでは普通に書けますText、次に stringsdict を使用して、キーに対応する複数のルールを提供します。

var body: some View {
    Text("\(photosCount) Photos Selected")
}

キーポイント:

  • photosCountローカライズされた文字列を入力すると、stringsdict は奇数、偶数、少数派、その他などの分岐を決定します。
  • トランスクリプト 英語とアラビア語での比較: 1、2、3 ~ 10、11 およびそれ以上では、異なる文法形式がトリガーされます。
  • コードは 1 回だけ書き込まれます。新しい言語を追加する場合、主に翻訳と複数化のルールが補足されます。

重要ポイント

  • 複数地域の天気カード: やるべきこと: 気温、風速、気圧のモデリングを次のように統一します。Measurement。実行する価値がある理由: データ ソースは引き続きメートル法を使用でき、インターフェイスにはユーザーの地域に応じて適切な単位が表示されます。開始方法: まず、表示レイヤーの手書きの単位文字列を次のように置き換えます。MeasurementFormatter

  • 健康または運動時間の概要: やるべきこと: 「今週 2 時間 26 分間トレーニングしました」や「昨日トレーニングを完了しました」などのコピーを日付フォーマッタに送信します。実行する価値がある理由: 期間、間隔、相対時間は、言語ごとに順序や語形が異なります。開始方法: 期間DateComponentsFormatter、日付範囲の場合DateIntervalFormatter、相対日付を使用しますRelativeDateTimeFormatter

  • 連絡先のプロフィール写真: 対処方法: プロフィール写真がない場合はイニシャルを表示し、長すぎる場合はアイコンに戻ります。実行する価値がある理由: 名前の順序、ニックネーム、略語規則、および中国語、日本語、韓国語の名前表示はハードコーディングには適していません。開始方法: 使用するPersonNameComponentsFormatter生成する.abbreviatedスタイルを設定し、文字数と実際のレイアウト サイズによって保護されます。

  • 自然言語の概要をフィルタリング: 設定ページまたは検索結果ページに「英語、スペイン語、フランス語」などのリストを表示します。実行する価値がある理由: リスト コネクタは言語や要素の順序によって異なり、手書きのコネクタはエラーが発生しやすくなります。開始方法: 配列構造を保持し、それを表示レイヤーで呼び出します。ListFormatter.localizedString(byJoining:)

  • 写真選択複数コピー: 対処方法: 「1 枚の写真を選択」、「2 枚の写真を選択」、およびアラビア語の偶数、少数派、その他の形式のローカライズされたリソースを作成します。実行する価値がある理由: 複数ルールは、単数と複数を単純に切り替えるものではありません。開始方法: SwiftUI 続行Text("\(photosCount) Photos Selected")、対応するキーの stringsdict を構成します。

関連セッション

コメント

GitHub Issues · utterances