Widzę pewne dziwne zachowanie w klasie, którą stworzyłem jakiś czas temu, gdzie wydaje się, że właściwości struktury zmieniają się natychmiast po przekazaniu (skopiowaniu) do metody.Przekazanie ogólnej struktury dla nienazwanego domyślnego parametru powoduje wyświetlenie właściwości śmieci
ja gotuje go do prostego testu, które mogą być uruchamiane na placu zabaw:
struct StructToPass<T> {
let x: T
}
class MyClass<T> {
func createAndPassStructWithValue(value: T) {
let structToPass = StructToPass(x: value)
println("Before passing to method: \(structToPass.x)")
passStruct(structToPass)
}
func passStruct(_ theStruct: StructToPass<T>? = nil) {
println("Inside method: \(theStruct!.x)")
}
}
let myClass = MyClass<Int>()
myClass.createAndPassStructWithValue(42)
patrząc na odpowiednich sprawozdań drukowanych, to pokazuje, że struct jest x
nieruchomość zmieniła:
// Before passing to method: 42
// Inside method: 140734543799888
Tworzenie struct poza klasą i nazywając passStruct(_:)
bezpośrednio powoduje awarię zabaw, podobnie jak pisanie passStruct(_:)
jako funkcję:
// Causes playground to crash:
let aStruct = StructToPass(x: 42)
myClass.passStruct(aStruct)
// Also causes playground to crash:
func passStruct<T>(_ theStruct: StructToPass<T>? = nil) {}
passStruct(aStruct)
Zmiana passStruct(_:)
metody/funkcji, aby użyć domyślnego zewnętrzną nazwę parametru rozwiązuje problemu, podobnie jak wprowadzenie innego parametru (przed/po parametr domyślny):
// This works:
func passStruct<T>(theStruct: StructToPass<T>? = nil) {
println("Inside function: \(theStruct!.x)")
}
passStruct(theStruct: aStruct)
// This also works:
func passStruct<T>(_ theStruct: StructToPass<T>? = nil, someOtherParam: Int) {
println("Inside function: \(theStruct!.x)")
}
passStruct(aStruct, 42)
Czy to błąd kompilatora? Wydaje się, że kompilatorowi się to nie podoba, gdy ogólna funkcja/metoda z pojedynczym argumentem o wartości domyślnej nie używa zewnętrznej nazwy parametru. To konkretny przypadek, ale myślę, że powinien zadziałać. Jeśli to nie powinno działać, powinno być ostrzeżenie kompilatora.
Dzięki za twój wkład. Przesłałem zgłoszenie błędu. – Stuart