2015-04-20 31 views
11

Tôi thấy một số hành vi kỳ lạ trong lớp mà tôi đã tạo trước đây, có vẻ như thuộc tính của cấu trúc đang thay đổi ngay sau khi được truyền (sao chép) sang phương thức.Chuyển cấu trúc chung cho kết quả tham số mặc định chưa được đặt tên trong các thuộc tính rác

Tôi đã luộc nó xuống đến một trường hợp thử nghiệm đơn giản mà có thể được chạy trong một sân chơi:

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) 

Nhìn vào những điều khoản in phù hợp, nó cho thấy rằng bất động sản x của struct đã thay đổi:

// Before passing to method: 42 
// Inside method: 140734543799888 


Tạo cấu trúc bên ngoài lớp và gọi passStruct(_:) trực tiếp khiến sân chơi gặp sự cố, đồng thời viết passStruct(_:) làm chức năng:

// 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) 


Thay đổi passStruct(_:) phương pháp/chức năng sử dụng tên thông số bên ngoài mặc định sửa chữa vấn đề này, cũng như giới thiệu thông số khác (trước/sau khi thông số mặc định):

// 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) 


Is đây là lỗi trình biên dịch? Dường như trình biên dịch không thích nó khi một hàm/phương thức chung với một đối số duy nhất với một giá trị mặc định không sử dụng tên tham số bên ngoài. Đó là một trường hợp cụ thể, nhưng tôi nghĩ rằng nó nên làm việc. Nếu nó không hoạt động, cần phải có một cảnh báo trình biên dịch.

Trả lời

2

Lỗi trình biên dịch 110%. Tôi thậm chí đã cố gắng này ra khỏi sân chơi. Tất cả đều vui vẻ biên dịch cho đến khi bạn muốn thêm một dòng mà thực sự làm một cái gì đó, giống như gửi một passStruct. Có nhiều thứ sai trái với điều này. Tôi thậm chí đã có lỗi này:

func passStruct<T>(_ theStruct: StructToPass<T>? = (nil as StructToPass<T>?)) { 
    println("Inside function: \(theStruct!.x)") 
} 

mà tôi cho rằng có thể là vấn đề (mặc dù không phải là tôi đã có ở nơi khác).

Cũng được tìm thấy! Báo cáo nó. Họ rõ ràng không hoàn thành với Generics. Trong các thử nghiệm của tôi, tôi thấy rằng các thuộc tính lớp chung không được phép.

static let nilStruct: StructToPass<T>? = nil 

không biên dịch, với một trong các thông báo lỗi "chưa được hỗ trợ".

+1

Cảm ơn bạn đã nhập. Tôi đã gửi báo cáo lỗi. – Stuart

Các vấn đề liên quan