Giả sử bạn cóđèo trong một loại để một phần mở rộng Swift chung chung, hoặc lý tưởng suy ra nó
class Fancy:UIView
bạn muốn tìm tất cả anh chị em Fancy
quan điểm. No problem ...
for v:UIView in superview!.subviews
{
if let f = v as? Fancy
{ f.hungry = false }
}
Vì vậy, hãy thử một phần mở rộng,
public extension UIView
{
internal func fancySiblings()->([Fancy])
{
return (self.superview!
.subviews
.filter { $0 != self }
.flatMap { $0 as? Fancy }
)
}
}
Awesome, bạn có thể bây giờ
for f:Fancy in self.fancySiblings()
{ f.hungry = false }
Fantastic.
Nhưng,
Làm cách nào để khái quát hóa tiện ích mở rộng đó hoạt động với bất kỳ loại phụ UIView nào?
Lý tưởng nhất, tiện ích mở rộng có suy ra loại không? Cũng như dùng một loại?
Vì vậy, một cái gì đó giống như ...
public extension UIView
{
internal func siblings<T>(something T)->([T])
{
return (self.superview!
.subviews
.filter { $0 != self }
.flatMap { $0 as? T }
)
}
và sau đó bạn có thể gọi nó là một cái gì đó như thế này ...
for f in self.siblings(Fancy)
for p in self.siblings(Prancy)
for b in self.siblings(UIButton)
Làm thế nào bạn có thể "nói" một phần mở rộng chung loại sử dụng , như thế à ??
Dường như bạn có thể "suy ra nó ngược",
public extension UIView
{
internal func incredible<T>()->([T])
{
return (self.superview!
.subviews
.filter { $0 != self }
.flatMap { $0 as? T }
)
}
for f:Fancy in self.incredible()
for p:Prancy in self.incredible()
Đó là tuyệt vời nhưng không hoạt động theo cách khác.
Bạn thậm chí có thể ...
self.siblings().forEach{
(f:Fancy) in
d.hasRingOn = false
}
Vì vậy, tôi sẽ vẫn muốn biết làm thế nào để "vượt qua trong" một loại cái gì đó như for f in self.siblings(Fancy)
và lý tưởng, thậm chí suy ra nó cũng có.
Câu hỏi tương tự: http://stackoverflow.com/questions/37216240/generic-function-taking-a-type-name-in-swift (Nếu bạn không nghĩ câu trả lời cho câu hỏi của bạn, điều đó không sao - nhưng đó là cùng một vấn đề cơ bản). – Hamish