The @available
on Identifiable
does not get tripped at compile time when it is inherited. This feels like a bug (maybe even is a known bug).
I have tried to minimize a reproducible case. This seems pretty close.
import XCTest
protocol ProtocolIdentifiable: Identifiable {}
func use<I: ProtocolIdentifiable>(_ item: I) {
print(item.id)
}
struct Conformance: ProtocolIdentifiable {
let id = UUID()
}
final class ProtocolIdentifiableTests: XCTestCase {
func testExample() {
use(Conformance())
}
static var allTests = [
("testExample", testExample),
]
}
Indeed, I can build and run the above code on iOS 12 albeit with an (expected) runtime crash.
#!/usr/bin/env zsh
set -e
set -x
XCODE_SCHEME="ProtocolIdentifiable"
XCODE_RESULT="ProtocolIdentifiable.xcresult"
DESTINATION="platform=iOS Simulator,name=iPad Pro (9.7-inch),OS=12.4"
rm -rf "$PWD/derivedData" "$PWD/.build" "$PWD/.swiftpm" "$PWD/$XCODE_RESULT"
xcodebuild -derivedDataPath "$PWD/derivedData" -scheme "$XCODE_SCHEME" -destination "$DESTINATION" build-for-testing
xcodebuild -derivedDataPath "$PWD/derivedData" -resultBundlePath "$XCODE_RESULT" -destination "$DESTINATION" -xctestrun derivedData/Build/Products/*.xctestrun test-without-building
If I however, change the code to:
import XCTest
func use<I: Identifiable>(_ item: I) {
print(item.id)
}
struct Conformance: Identifiable {
let id = UUID()
}
final class ProtocolIdentifiableTests: XCTestCase {
func testExample() {
use(Conformance())
}
static var allTests = [
("testExample", testExample),
]
}
Then build as above it stops during compilation with an error (as expected):
ProtocolIdentifiableTests.swift:3:13: error: 'Identifiable' is only available in iOS 13 or newer
func use<I: Identifiable>(_ item: I) {
Is this a bug or is this working as designed?