<html devsite>
<head>
  <meta name="project_path" value="/_project.yaml">
  <meta name="book_path" value="/versions/6.4.0/_book.yaml">
</head>
<body>

<h1 class="page-title" id="modules.XcodeProperties">XcodeProperties</h1>

<!-- {% raw %} -->

A provider containing information about a version of Xcode and its properties.

<h2>Members</h2>
<ul>
    <li>
    <a href="#default_ios_sdk_version">default_ios_sdk_version</a>
  </li>
      <li>
    <a href="#default_macos_sdk_version">default_macos_sdk_version</a>
  </li>
      <li>
    <a href="#default_tvos_sdk_version">default_tvos_sdk_version</a>
  </li>
      <li>
    <a href="#default_visionos_sdk_version">default_visionos_sdk_version</a>
  </li>
      <li>
    <a href="#default_watchos_sdk_version">default_watchos_sdk_version</a>
  </li>
      <li>
    <a href="#to_json">to_json</a>
  </li>
      <li>
    <a href="#to_proto">to_proto</a>
  </li>
      <li>
    <a href="#xcode_version">xcode_version</a>
  </li>
  </ul>

      <h2 id="default_ios_sdk_version">default_ios_sdk_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> XcodeProperties.default_ios_sdk_version</pre></p>

    The default iOS sdk version for this version of xcode, or <code>None</code> if unknown.

         May return <code>None</code>.

        <h2 id="default_macos_sdk_version">default_macos_sdk_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> XcodeProperties.default_macos_sdk_version</pre></p>

    The default macOS sdk version for this version of xcode, or <code>None</code> if unknown.

         May return <code>None</code>.

        <h2 id="default_tvos_sdk_version">default_tvos_sdk_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> XcodeProperties.default_tvos_sdk_version</pre></p>

    The default tvOS sdk version for this version of xcode, or <code>None</code> if unknown.

         May return <code>None</code>.

        <h2 id="default_visionos_sdk_version">default_visionos_sdk_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> XcodeProperties.default_visionos_sdk_version</pre></p>

    The default visionOS sdk version for this version of xcode, or <code>None</code> if unknown.

         May return <code>None</code>.

        <h2 id="default_watchos_sdk_version">default_watchos_sdk_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> XcodeProperties.default_watchos_sdk_version</pre></p>

    The default watchOS sdk version for this version of xcode, or <code>None</code> if unknown.

         May return <code>None</code>.

        <h2 id="to_json">to_json</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> XcodeProperties.to_json()</pre></p>

    <b>Deprecated</b>. This API is deprecated and will be removed soon. Please do not depend on it. It is <i>disabled</i> with <code>---incompatible_struct_has_no_methods</code>. Use this flag to verify your code is compatible with its imminent removal. <br>Creates a JSON string from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs, a list of these types or a dictionary with string keys and values of these types. Quotes and new lines in strings are escaped. Examples:<br><pre class=language-python>struct(key=123).to_json()
# {"key":123}

struct(key=True).to_json()
# {"key":true}

struct(key=[1, 2, 3]).to_json()
# {"key":[1,2,3]}

struct(key='text').to_json()
# {"key":"text"}

struct(key=struct(inner_key='text')).to_json()
# {"key":{"inner_key":"text"}}

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_json()
# {"key":[{"inner_key":1},{"inner_key":2}]}

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_json()
# {"key":{"inner_key":{"inner_inner_key":"text"}}}
</pre>.<p>Deprecated: instead, use json.encode(x) or json.encode_indent(x), which work for values other than structs and do not pollute the struct field namespace.


        <h2 id="to_proto">to_proto</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> XcodeProperties.to_proto()</pre></p>

    <b>Deprecated</b>. This API is deprecated and will be removed soon. Please do not depend on it. It is <i>disabled</i> with <code>---incompatible_struct_has_no_methods</code>. Use this flag to verify your code is compatible with its imminent removal. <br>Creates a text message from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs or dicts or lists of these types. Quotes and new lines in strings are escaped. Struct keys are iterated in the sorted order. Examples:<br><pre class=language-python>struct(key=123).to_proto()
# key: 123

struct(key=True).to_proto()
# key: true

struct(key=[1, 2, 3]).to_proto()
# key: 1
# key: 2
# key: 3

struct(key='text').to_proto()
# key: "text"

struct(key=struct(inner_key='text')).to_proto()
# key {
#   inner_key: "text"
# }

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_proto()
# key {
#   inner_key: 1
# }
# key {
#   inner_key: 2
# }

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_proto()
# key {
#    inner_key {
#     inner_inner_key: "text"
#   }
# }

struct(foo={4: 3, 2: 1}).to_proto()
# foo: {
#   key: 4
#   value: 3
# }
# foo: {
#   key: 2
#   value: 1
# }
</pre><p>Deprecated: use proto.encode_text(x) instead.


        <h2 id="xcode_version">xcode_version</h2>
        <p><pre class="rule-signature"><a class="anchor" href="string.html">string</a> XcodeProperties.xcode_version</pre></p>

    The xcode version, or <code>None</code> if the xcode version is unknown.

         May return <code>None</code>.


</body>
</html>

<!-- {% endraw %} -->
