Saya mulai belajar Swift, dan telah mengikuti ceramah video Stanford University yang sangat bagus di YouTube. Berikut ini tautan jika Anda tertarik atau itu membantu (walaupun tidak diperlukan untuk memahami masalah saya):
Mengembangkan Aplikasi iOS 8 dengan Swift - 2. Lebih banyak Xcode dan Swift, MVC
Sambil mengikuti kuliah saya sampai pada titik di mana (sejauh yang saya tahu) kode saya identik dengan kode dalam video tetapi pada sistem saya, saya mendapat kesalahan kompiler. Setelah banyak percobaan dan kesalahan saya berhasil mengurangi kode saya menjadi dua contoh, satu di antaranya menghasilkan kesalahan, yang lain atau yang tidak, tetapi saya tidak tahu apa yang sebenarnya menyebabkan kesalahan atau bagaimana menyelesaikannya.
Kode yang menyebabkan kesalahan adalah:
import UIKit
class BugViewController: UIViewController
{
func perform(operation: (Double) -> Double) {
}
func perform(operation: (Double, Double) -> Double) {
}
}
Ini menciptakan kesalahan kompilator berikut:
Metode 'perform' dengan pemilih Objective-C konflik 'perform:' dengan deklarasi sebelumnya dengan pemilih Objective-C yang sama
Dengan hanya menghapus sub-classing dari UIViewController kompilasi kode:
import UIKit
class BugViewController
{
func perform(operation: (Double) -> Double) {
}
func perform(operation: (Double, Double) -> Double) {
}
}
Beberapa informasi lain yang mungkin relevan atau tidak relevan:
- Saya baru saja ditingkatkan ke Yosemite.
- Ketika saya menginstal Xcode, saya berakhir dengan versi Beta (Versi 6.3 (6D543q)) karena (jika saya ingat dengan benar) ini adalah versi yang saya perlukan untuk berjalan di versi OS X.
Saya setengah berharap ini adalah bug di kompiler karena kalau tidak, ini tidak masuk akal bagi saya. Bantuan apa pun dengan penuh terima kasih diterima!
Jawaban:
Objective-C tidak mendukung kelebihan metode, Anda harus menggunakan nama metode yang berbeda. Saat Anda mewarisi UIViewController, Anda mewarisi NSObject dan membuat kelas bisa di-interopable ke Obj-C. Swift di sisi lain mendukung kelebihan beban, itulah mengapa ia bekerja saat Anda menghapus warisan.
sumber
UIFont
setiap hari.Saya sendiri juga mengambil kursus Standford dan saya terjebak di sini untuk waktu yang lama juga, tetapi setelah beberapa pencarian, saya menemukan sesuatu dari sini: Catatan rilis Xcode dan menyebutkan sesuatu di bawah:
yang saya lakukan hanya menambahkan "pribadi" di depan metode override seperti ini:
sumber
Seperti yang sudah dijawab, ObjC tidak mendukung metode overloading (dua metode dengan nama yang sama) dan In swift 2 di bawah Xcode 7 ada dua opsi untuk menyelesaikan masalah seperti ini. Salah satu opsi adalah mengubah nama metode menggunakan atribut:
@objc(newNameMethod:)
opsi lain untuk mengatasi masalah ini di Xcode 7+ adalah dengan menerapkan
@nonobjc
atribut ke metode, subskrip atau penginisialisasi apa punsumber
Masalah adalah
UIViewController
adalah@objc
kelas. Ketika mewarisi dariUIViewController
,BugViewController
juga a@objc
kelas.Ini berarti harus sesuai dengan aturan penyeleksi Objective-C (nama metode). Metode
func perform(operation: (Double) -> Double)
danfunc perform(operation: (Double, Double) -> Double)
keduanya memiliki pemilih yang sama@selector(perform:)
. Ini tidak diizinkanUntuk mengatasi ini, gunakan nama yang berbeda: suka
func perform1(operation: (Double) -> Double)
danfunc perform2(operation: (Double, Double) -> Double)
.Saya pikir cara terbaik untuk menangani ini adalah memberikan
perform()
metode Anda nama yang lebih deskriptif. Apa yang dilakukan metode ini? Bagaimana mereka mengubah status pengontrol tampilan? LihatlahUIViewController
metode lain untuk merasakan gaya penamaan metode, atau baca Metode Nama Harus Ekspresif dan Unik di Dalam Kelassumber
Dari https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html di bawah "Xcode 6.3 Catatan Rilis" -> "Perubahan Bahasa Swift" yang Anda temukan
sumber
Saya mendapat kesalahan yang sama karena memiliki dua metode dengan tanda tangan Obj-C yang sama:
Saya tidak ingin menandai salah satu dari mereka sebagai @nonobjc karena kemungkinan konsekuensi yang tidak terduga pada saat runtime. (Seseorang dapat memperbaiki saya jika tidak ada kemungkinan)
Diatasi dengan menggunakan fitur nama parameter eksternal Swift (saya membuat nama eksternal sama dengan nama lokal) ke metode kedua, yang secara efektif mengubah tanda tangan metode Obj-c:
sumber