"Should not extend type you don't own with protocol you don't own" is the advice, but

That's the cost, yeah. It might be possible to solve this with nested property wrappers; a quick simplified attempt seems to work.

(code)
import SwiftUI

@propertyWrapper
struct Wrap {
	var wrappedValue: Int
}
extension Wrap: RawRepresentable {
	var rawValue: String {
		wrappedValue.description
	}
	init?(rawValue: String) {
		guard let value = Int(rawValue) else {
			return nil
		}
		wrappedValue = value
	}
}

struct Test {
	@AppStorage("x") @Wrap var x: Int = 5
}

Test().x = 6
print(UserDefaults.standard.object(forKey: "x"))

I meant "…SinceReferenceDate" but once again the fact that it's ambiguous sort of points out why you shouldn't do this: someone else might have different opinions.

2 Likes