Help us understand the problem. What is going on with this article?

.plistってなんやねん?

iOSアプリなんかを開発しているとよく目にする.plistというファイル。実際どういったものなのか分からなかったので、調べてみました。

.plistとは

plistとはプロパティリストの略で言葉の通りプロパティを格納するためのファイルです。拡張子に.plistを持ち、
一般的にplistファイルと呼ばれているみたいです。
このplistファイルをパース(構文解析)するためにはNSPropertyListSerializationクラスがiOSにおいては必要となります。androidにおいてはここではスルーします。上記で出てきたNSPropertyListSerializationクラスはシリアル化(オブジェクトをバイト列やテキストに変換)された形式とプロパティリストオブジェクトを変換するメソッドを持つクラスです。そのため、このクラスがないとパースできず読み込めないみたいです。

下記にNSPropertyListSerializationクラスの公式リファレンスを載せときます。
https://developer.apple.com/documentation/foundation/nspropertylistserialization

ざっくりですがとりあえずこんな感じみたいです。

.plistの2つの形式

.plistには2つの形式があり、それにより文法も異なります。

NeXT形式plistの文法

NeXT形式の文法は簡単いうと、小カッコ()で括られた中身が配列、中カッコ{}で括られた中身がディクショナリを表します。配列の用語ごとの区切りはカンマ(,)で、ディクショナリの要素ごとの区切りはセミコロン(;)で記述されます。文字列はダブルクオート(")で括られ、文字列以外のバイナリデータは<>で括られた16進数の集まりで表現されます。そして数値や真偽値に対応する表現は存在しません。
大体以下のような記述になります。

{
    "キー1" = "値1";
   //ディクショナリ
    "キー2" = {
        "サブキー1" = "値2";
        };
    //配列
    "キー3" = (
        "配列メンバー1",
        "配列メンバー2",
        "配列メンバー3"
    );
}

XML形式plistの文法

下記のコードは先ほどのNeXT形式のコードをXML形式に変換したものです。
最初のの部分はXMLの宣言をしている文で、これからXML形式で記述しますよ!と言っている感じです。
次にDOCTYPE宣言の下のplistから/plistがplistの内容になります。
dictはディクショナリを、keyはディクショナリのキーを、arrayは配列を、stringはディクショナリ内であればバリューを、配列内であれば配列の要素を表しています。
ここで使用したXMLはHTMLと同じマークアップ言語であり、主にデータのやり取りを管理する目的で使われているものです。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/CTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>キー1</key>
  <string>値1</string>
  <key>キー2</key>
  <dict>
    <key>サブキー1</key>
    <string>値2</string>
  </dict>
  <key>キー2</key>
  <array>
    <string>配列メンバー1</string>
    <string>配列メンバー2</string>
    <string>配列メンバー3</string>
  </array>
</dict>
</plist>

2つの形式の背景と注意点

もともとplistファイルというのは、NeXTSTEPというOSで使われていたデータの表現形式が元となってできました。この当時はまだXMLではなくNeXTで書かれていていました。しかしその後、NeXTソフトフェア(NeXTSTEP OSをリリースしていたソフトウェア)がAppleに買収され、この時に当時流行っていたXMLを利用したXML形式のplistが用意されました。このおかげで数値や真偽を表現できるようになりました。

ざっくりいうとこんな背景があるため、
Mac OSでは古いNeXT形式のplistも使用できるが、新しいXML形式を使うことが推奨されています。
そしてXML形式のplistはMacOSで各フレームワークで読み込みのみの利用しか可能になっていないため注意が必要です。

最後に

plistについて全く知識がなかったので、とりあえずざっくりとまとめてみました。解説等不十分な点あると思いますが、ご了承ください。

もう少し詳しく知りたいという方は下記に参考リンクを貼っておきますのでそこから確認してください。

最後まで読んでいただきありがとうございました。

参考リンク

https://www.itmedia.co.jp/enterprise/articles/0705/14/news013.html
https://developer.apple.com/documentation/foundation/nspropertylistserialization
https://secondflush2.blog.fc2.com/blog-entry-1012.html
https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%83%AA%E3%82%B9%E3%83%88

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away