---
title: 'XcodeProperties'
---

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

## Members

* [default\_ios\_sdk\_version](#default_ios_sdk_version)
* [default\_macos\_sdk\_version](#default_macos_sdk_version)
* [default\_tvos\_sdk\_version](#default_tvos_sdk_version)
* [default\_visionos\_sdk\_version](#default_visionos_sdk_version)
* [default\_watchos\_sdk\_version](#default_watchos_sdk_version)
* [to\_json](#to_json)
* [to\_proto](#to_proto)
* [xcode\_version](#xcode_version)

## default\_ios\_sdk\_version

```
string XcodeProperties.default_ios_sdk_version
```

The default iOS sdk version for this version of xcode, or `None` if unknown.
May return `None`.

## default\_macos\_sdk\_version

```
string XcodeProperties.default_macos_sdk_version
```

The default macOS sdk version for this version of xcode, or `None` if unknown.
May return `None`.

## default\_tvos\_sdk\_version

```
string XcodeProperties.default_tvos_sdk_version
```

The default tvOS sdk version for this version of xcode, or `None` if unknown.
May return `None`.

## default\_visionos\_sdk\_version

```
string XcodeProperties.default_visionos_sdk_version
```

The default visionOS sdk version for this version of xcode, or `None` if unknown.
May return `None`.

## default\_watchos\_sdk\_version

```
string XcodeProperties.default_watchos_sdk_version
```

The default watchOS sdk version for this version of xcode, or `None` if unknown.
May return `None`.

## to\_json

```
string XcodeProperties.to_json()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
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:

```
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"}}}
```

.

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.

## to\_proto

```
string XcodeProperties.to_proto()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
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:

```
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
# }
```

Deprecated: use proto.encode\_text(x) instead.

## xcode\_version

```
string XcodeProperties.xcode_version
```

The xcode version, or `None` if the xcode version is unknown.
May return `None`.