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

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

{% dynamic setvar source_file "src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodePropertiesApi.java" %}
{% dynamic setvar version "7.1.0" %}
{% dynamic setvar original_path "/rules/lib/providers/XcodeProperties" %}
{% include "_buttons.html" %}
<!-- {% 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="../core/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="../core/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="../core/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="../core/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="../core/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="../core/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="../core/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="../core/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 %} -->
