SORU
8 HAZİRAN 2014, Pazar


Swift rakamsal ve CGFloat (CGPoint, CGRect, vb.)

Ben bulmak Swift rakamsal özellikle sakar, sık sık olur gerçek hayatta, ben iletişim kurmak Cocoa Touch ile ilgili CGRect ve CGPoint (örneğin, çünkü konuşuyoruz hakkında bir şey frame bounds).

CGFloat vs Çift

UİViewController bir alt sınıf, masum görünümlü aşağıdaki kodu göz önünde bulundurun:

let scale = 2.0
let r = self.view.bounds
var r2 = CGRect()
r2.size.width = r.size.width * scale

Bu kodu derlemek için, son satırında, her zamanki gizemli hata ile başarısız:

'*' Verilen bağımsız değişkenleri kabul eder . bir aşırı bulunamadı

Bu hata, bildiğiniz gibi, türleri arasında empedans uyumsuzluğu bir şeyi gösteriyor. r.size.width otomatik olarak Hızlı bir Şamandıra ile değiş tokuş ama Hızlı Çifte bir değişken ile birlikte bir CGFloat olarak, varsayılan olarak, scale ne olan) geldi.

Örneğin, yapay olarak kısa, en başından beri bir Yüzer scale döküm olan yapay olarak basit bir çözümü var. Ama çok değişken her yerde çekilen önerilen bir CGRect ögeleri hesaplanmasında söz konusu olduğunda, yapacak bir döküm var.

Ayrıntılı Başlatıcı

Başka bir tahriş zaman yeni bir CGRect oluşturmak için geldiğinde ne olacak. Belgelere rağmen, etiketsiz değerlerle ama başlatıcı yok. Bu Çiftler var çünkü derleme başarısız:

let d = 2.0
var r3 = CGRect(d, d, d, d)

Ama eğer bir Yüzer d yayınlamadık bile, derleme değiliz:

Kayıp argüman etiketleri 'x:y:genişlik:yükseklik:' Ara

Geri Objective-C üzerinde hiçbir gelişme Ve bazen hiçbir gelişme CGRectMake CGSizeMake olan CGRectMake, üzerine düşen bitiriyoruz. Uygulamalarımdan birisi: bu gerçek kodu göz önünde bulundurun

let kSEP : Float = 2.0
let intercellSpacing = CGSizeMake(kSEP, kSEP);

Projelerimden birinde işe yarar. Başka gizemli bir şekilde başarısız — aynı kod! — bu hata ile

''Bir alt tür değildir'' . CGFloat NSNumber

Gibi, bazen Hızlı çalışır için "köprüden" tarafından döküm bir Yüzer bir NSNumber, elbette yanlış bir şey yapmadıkları zaman ne öbür tarafta köprü beklediği bir CGFloat. Henüz fark hata bir görünmesine neden olan iki proje arasında ne olduğunu ama diğer (belki de başka biri vardır) anladım değil.

NOT:Bu sorunu çözmüş olabilirim: sırayla 64-bit sorunu. bu bir gösteriyor İnşa Etkin Mimarlık Sadece inşa ayar, bağlı gibi görünüyor Sense, Şamandıra beri kılan 64 bitlik bir cihaz üzerinde CGFloat için bir maç olmaz. Bu empedans uyumsuzluğu sorunu düşündüğümden çok daha kötü olduğu anlamına gelir.

Sonuç

Bu konu hakkında bilgelik pratik kelime arıyorum. Birinin hayatını çok daha kolay hale getirecek CGRect ve CGPoint uzantısı bazı önemli olabilir diye düşünüyorum. (Ya da belki birisi ya da "işleri" — eğer bu mümkünse.) İnt Double ile CGFloat birleştirme gibi ek aritmetik operatör işlev aşırı bir gemi dolusu yazmış

CEVAP
8 HAZİRAN 2014, Pazar


Açıkça keşfettim gibi CGFloat,, scale yazarak gerçekten hızlı yazma sorunu ele yoludur. Diğerleri için: referans için

let scale: CGFloat = 2.0
let r = self.view.bounds
var r2 = CGRect()
r2.size.width = r.width * scale

İkinci Sorunuzun cevabı için nasıl emin değil, ayrı ayrı farklı bir başlık ile yazılan isteyebilirsiniz.

Güncelleme:

Swift yaratıcısı ve baş geliştiricisi Chris Lattner bu Temmuz Apple Developer Forum bu konuda 4, 2014: söylemek zorunda kaldım

Burada neler olduğunu CGFloat ya da Yüzen bir typealias olmasıdır ya 32 veya 64-bit için inşa ediyorsun bağlı olarak Çift. Bu Objective-C tam olarak nasıl çalıştığını, ama Swift sorunludur Swift örtülü dönüşüm izin vermez çünkü.

Farkındayız bu sorun ve ciddi olarak düşünün: birkaç değerlendiriyoruz farklı çözümleri bir rulo olacak şu an ve daha sonra bir beta. Fark ettiğiniz gibi, Çift çevrim, bu bugün ile başa çıkabilir. Bu çok kaba ama etkili :-)

Böyle Büyük Mükafat 6 Update Beta 5:

Bir CGFloat herhangi bir Tamsayı türünden inşa edilebilir (dahil tamsayı türleri boy) ve tersi. (17670817)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • mobilenet.cz

    mobilenet.cz

    26 NİSAN 2008